Json格式以及常见的Json解析器

目录

什么是JSON?

交换数据

JSON 语法

JSON 语法规则

JSON 数据- 名称和值

实例

JSON 值

JSON 数据类型

有效的数据类型

JSON 字符串

实例

JSON 数字

实例

JSON 对象

实例

JSON 数组

实例

JSON 布尔

实例

JSON 对象

对象语法

实例

访问对象值

实例

嵌套的 JSON 对象

实例

实例

JSON 数组

作为 JSON 对象的数组

实例

JSON 对象中的数组

实例

常见的json解析工具

Jackson

Jackson 的核心模块由三部分组成。

ObjectMapper 的 使用

信息配置

Jackson 的 注解的使用

FastJson

Fastjson 简介

Fastjson 特性

将 Java 对象转换为 JSON 格式

JSON 字符串转换为 Java 对象


什么是JSON

JSON(JavaScript Object Notation, JS 对象标记 ) 是一种轻量级的数据交换格式,目前使用特别广
泛。
采用完全独立于编程语言的 文本格式 来存储和表示数据。
简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。
易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
JavaScript 语言中,一切都是对象。因此,任何 JavaScript 支持的类型都可以通过 JSON 来表示,例
如字符串、数字、对象、数组等。看看他的要求和语法格式:
对象表示为键值对,数据由逗号分隔
花括号保存对象
方括号保存数组
JSON 键值对 是用来保存 JavaScript 对象的一种方式,和 JavaScript 对象的写法也大同小异,键 / 值对组
合中的键名写在前面并用双引号 "" 包裹,使用冒号 : 分隔,然后紧接着值:
{"name": "QinJiang"}
{"age": "3"}
{"sex": "男"}

JSON JavaScript 对象的字符串表示法,它使用文本表示一个 JS 对象的信息,本质是一个字符
var obj = {a: 'Hello', b: 'World'}; //这是一个对象,注意键名也是可以使用引号包裹
的
var json = '{"a": "Hello", "b": "World"}'; //这是一个 JSON 字符串,本质是一个
字符串
JSON JavaScript 对象互转
要实现从 JSON 字符串转换为 JavaScript 对象,使用 JSON.parse() 方法:
 /*json转化为JavaScript*/
        var a = JSON.parse('{"a","hello"}')
        /*要实现从JavaScript 对象转换为JSON字符串,使用 JSON.stringify() 方法*/
        var json = JSON.stringify({a: 'Hello', b: 'World'});

交换数据

当数据在浏览器与服务器之间进行交换时,这些数据只能是文本。

JSON 属于文本,并且我们能够把任何 JavaScript 对象转换为 JSON,然后将 JSON 发送到服务器。

我们也能把从服务器接收到的任何 JSON 转换为 JavaScript 对象。

以这样的方式,我们能够把数据作为 JavaScript 对象来处理,无需复杂的解析和转译

JSON 语法

JSON 语法规则

JSON 语法衍生于 JavaScript 对象标记法语法:

  • 数据在名称/值对中
  • 数据由逗号分隔
  • 花括号容纳对象
  • 方括号容纳数组

JSON 数据- 名称和值

JSON 数据写为名称/值对。

名称/值由字段名称构成,后跟冒号和值:

实例

"name":"Bill Gates"

JSON 名称需要双引号。而 JavaScript 名称不需要。

JSON – 求值为 JavaScript 对象

JSON 格式几乎等同于 JavaScript 对象。

在 JSON 中,键必须是字符串,由双引号包围:

JSON 值

在 JSON 中,值必须是以下数据类型之一:

  • 字符串
  • 数字
  • 对象(JSON 对象)
  • 数组
  • 布尔
  • null

在 JavaScript 中,以上所列均可为值,外加其他有效的 JavaScript 表达式,包括:

  • 函数
  • 日期
  • undefined

在 JSON 中,字符串值必须由双引号编写:

JSON 数据类型

有效的数据类型

在 JSON 中,值必须是以下数据类型之一:

  • 字符串
  • 数字
  • 对象(JSON 对象)
  • 数组
  • 布尔
  • Null

JSON 的值不可以是以下数据类型之一:

  • 函数
  • 日期
  • undefined

JSON 字符串

JSON 中的字符串必须用双引号包围。

实例

{ "name":"John" }

JSON 数字

JSON 中的数字必须是整数或浮点数。

实例

{ "age":30 }

JSON 对象

JSON 中的值可以是对象。

实例

{
"employee":{ "name":"Bill Gates", "age":62, "city":"Seattle" }
}

JSON 数组

JSON 中的值可以是数组。

实例

{
"employees":[ "Bill", "Steve", "David" ]
}

JSON 布尔

JSON 中的值可以是 true/false。

实例

{ "sale":true }

JSON 对象

对象语法

实例

{ "name":"Bill Gates", "age":62, "car":null }

JSON 对象被花括号 {} 包围。

JSON 对象以键/值对书写。

键必须是字符串,值必须是有效的 JSON 数据类型(字符串、数字、对象、数组、布尔或 null)。

键和值由冒号分隔。

每个键/值对由逗号分隔。

访问对象值

您可以通过使用点号(.)来访问对象值:

实例

myObj =  { "name":"Bill Gates", "age":62, "car":null };
x = myObj.name;

嵌套的 JSON 对象

一个 JSON 对象中的值可以是另一个 JSON 对象。

实例

myObj =  {
   "name":"Bill Gates",
   "age":62,
   "cars": {
	  "car1":"Porsche",
	  "car2":"BMW",
	  "car3":"Volvo"
   }
}

您能够通过使用点号和括号访问嵌套的 JSON 对象:

实例

x = myObj.cars.car2;

JSON 数组

作为 JSON 对象的数组

实例

[  "Porsche", "BMW", "Volvo" ]

JSON 中的数组几乎与 JavaScript 中的数组相同。

在 JSON 中,数组值的类型必须属于字符串、数字、对象、数组、布尔或 null。

在 JavaScript 中,数组值可以是以上所有类型,外加任何其他有效的 JavaScript 表达式,包括函数、日期和 undefined。

JSON 对象中的数组

数组可以是对象属性的值:

实例

{
"name":"Bill Gates",
"age":62,
"cars":[ "Porsche", "BMW", "Volvo" ]
}

常见的json解析工具

Jackson

概述
         Jackson库(http://jackson.codehaus.org),是基于java语言的开源json格式解析工具,整个库(使用最新的2.2版本)包含3个jar包:

Jackson 的核心模块由三部分组成。

jackson-core.jar——核心包(必须),提供基于“流模式”解析的API。
jackson-databind——数据绑定包(可选),提供基于“对象绑定”和“树模型”相关API。
jackson-annotations——注解包(可选),提供注解功能。
 

 <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-core</artifactId>
      <version>2.9.3</version>
    </dependency>

    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-annotations</artifactId>
      <version>2.9.3</version>
    </dependency>

    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.9.3</version>
    </dependency>

Jackson的优势
         相对于java json解析的其他库,诸如json-lib、gson包,Jackson具有以下优点:

功能全面,提供多种模式的json解析方式,“对象绑定”使用方便,利用注解包能为我们开发提供很多便利。
性能较高,“流模式”的解析效率超过绝大多数类似的json包。
重要API
核心包:JsonPaser(json流读取),JsonGenerator(json流输出)。
数据绑定包:ObjectMapper(构建树模式和对象绑定模式),JsonNode(树节点)。
————————————————
 

ObjectMapper 的 使用

 在实际应用中,用的最多的是数据对象绑定的模式,即将一个对象序列化为json字符串和将一串json字符串反序列化为java对象或Map。

ObjectMapper 通过 writeValue 系列方法 将 java 对 象序列化 为 json,并 将 json 存 储成不同的格式,String(writeValueAsString),Byte Array(writeValueAsString),Writer, File,OutStream 和 DataOutput。

ObjectMapper 通过 readValue 系列方法从不同的数据源像 String , Byte Array, Reader,File,URL, InputStream 将 json 反序列化为 java 对象。

  User user = new User();
        user.setName("张三");
        ObjectMapper objectMapper = new ObjectMapper();
        String s = objectMapper.writeValueAsString(user);
        System.out.println(s);

 

 /*反序列化为Java格式*/
        Object o = objectMapper.readValue(s,User.class);
        System.out.println(o);

信息配置

在调用 writeValue 或调用 readValue 方法之前,往往需要设置 ObjectMapper 的相关配置信息。这些配置信息应用 java 对象的所有属性上。示例如下:

//在反序列化时忽略在 json 中存在但 Java 对象不存在的属性 
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,
   false); 
//在序列化时日期格式默认为 yyyy-MM-dd'T'HH:mm:ss.SSSZ 
mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,false) 
//在序列化时忽略值为 null 的属性 
mapper.setSerializationInclusion(Include.NON_NULL); 
//忽略值为默认值的属性 
mapper.setDefaultPropertyInclusion(Include.NON_DEFAULT);

Jackson 的 注解的使用

ackson 根据它的默认方式序列化和反序列化 java 对象,若根据实际需要,灵活的调整它的默认方式,可以使用 Jackson 的注解。常用的注解及用法如下。

表 1. Jackson 的 常用注解

注解 用法
@JsonProperty 用于属性,把属性的名称序列化时转换为另外一个名称。示例: 
@JsonProperty("birth_ d ate") 
private Date birthDate;
@JsonFormat 用于属性或者方法,把属性的格式序列化时转换成指定的格式。示例: 
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm") 
public Date getBirthDate()
@JsonPropertyOrder 用于类, 指定属性在序列化时 json 中的顺序 , 示例: 
@JsonPropertyOrder({ "birth_Date", "name" }) 
public class Person
@JsonCreator 用于构造方法,和 @JsonProperty 配合使用,适用有参数的构造方法。 示例: 
@JsonCreator 
public Person(@JsonProperty("name")String name) {…}
@JsonAnySetter 用于属性或者方法,设置未反序列化的属性名和值作为键值存储到 map 中 
@JsonAnySetter 
public void set(String key, Object value) { 
map.put(key, value); 
}
@JsonAnyGetter 用于方法 ,获取所有未序列化的属性 
public Map<String, Object> any() { return map; }

FastJson

Fastjson 简介

Fastjson 是一个 Java 库,可以将 Java 对象转换为 JSON 格式,当然它也可以将 JSON 字符串转换为 Java 对象。

Fastjson 可以操作任何 Java 对象,即使是一些预先存在的没有源码的对象。

Fastjson 源码地址:https://github.com/alibaba/fastjson

Fastjson 中文 Wiki:https://github.com/alibaba/fastjson/wiki/Quick-Start-CN

Fastjson 特性

  • 提供服务器端、安卓客户端两种解析工具,性能表现较好。
  • 提供了 toJSONString() 和 parseObject() 方法来将 Java 对象与 JSON 相互转换。调用toJSONString方 法即可将对象转换成 JSON 字符串,parseObject 方法则反过来将 JSON 字符串转换成对象。
  • 允许转换预先存在的无法修改的对象(只有class、无源代码)。
  • Java泛型的广泛支持。
  • 允许对象的自定义表示、允许自定义序列化类。
  • 支持任意复杂对象(具有深厚的继承层次和广泛使用的泛型类型)。
<dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>fastjson</artifactId>
      <version>1.2.78</version>
    </dependency>

将 Java 对象转换为 JSON 格式

private List<Person> listOfPersons = new ArrayList<Person>();
 
@Before
public void setUp() {
    listOfPersons.add(new Person(15, "John Doe", new Date()));
    listOfPersons.add(new Person(20, "Janette Doe", new Date()));
}
 
@Test
public void whenJavaList_thanConvertToJsonCorrect() {
    String jsonOutput= JSON.toJSONString(listOfPersons);
}

JSON 字符串转换为 Java 对象

@Test
public void whenJson_thanConvertToObjectCorrect() {
    Person person = new Person(20, "John", "Doe", new Date());
    String jsonObject = JSON.toJSONString(person);
    Person newPerson = JSON.parseObject(jsonObject, Person.class);
     
    assertEquals(newPerson.getAge(), 0); // 如果我们设置系列化为 false
    assertEquals(newPerson.getFullName(), listOfPersons.get(0).getFullName());
}

我们可以使用 JSON.parseObject() 将 JSON 字符串转换为 Java 对象。

注意反序列化时为对象时,必须要有默认无参的构造函数,否则会报异常:

@JSONField deserialize 可选项可以指定字段不反序列化。
@JSONField(name = "DATE OF BIRTH", deserialize=false)
private Date dateOfBirth;

Guess you like

Origin blog.csdn.net/weixin_47277897/article/details/121284746