什么是JSON

JSON 是一种轻量级的数据交换格式。采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的 层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。JSON几乎支持所有的主流语言。 

JSON无论对于人,还是对于机器来说,都是十分便于阅读和书写的,而且相比 XML(另一种常见的数据交换格式),文件更小,因此迅速成为流行的交换格式。

JSON语法由若干{Key,Value}组成,在花括号中保存对象,且数据之间采用逗号分隔。

使用[ ](中括号)来保存数组(集合) ,其中可以有多个对象。

JSON采用UTF-8字符编码集,不存在其他编码。

JSON使用 \ 进行特殊字符的转义

JSON序列化及反序列化

通常存在 JackSon,FastJSON(解析库JSON): 支持将JAVA Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JAVA Bean

这是JSON序列化和反序列化的实例

package com.my.hyz4;
import com.alibaba.fastjson2.JSON;
public class Demo02 {
	public static void main(String[] args) {
		PoliceStation pc1 = new PoliceStation();
		pc1.setAddr("西安警察局");
		pc1.setName("雁塔区");
		pc1.setTel("121313131");
		//序列化
		String json1 = JSON.toJSONString(pc1);
		System.out.println(json1);
		//反序列化
		String js2 = "{\"addr\":\"西安警察2局\",\"name\":\"雁塔3区\",\"tel\":\"qq121313131\"}";
		PoliceStation pc2 = JSON.parseObject(js2,PoliceStation.class);
		System.out.println(pc2);
	}
}

其中将pc1对象序列化为JSON对象,并且将字符串js2反序列化为PoliceStation对象js2。

JSON,JSONObject,JSONArray

JSONObject 类主要用于封装 key-value 键值对数据,它继承自 LinkedHashMap 接口,所以对它的理解和使用,可以参考Map集合。

JSONArray 类主要用于封装数组集合类的数据,它继承自 ArrayList 类。

JSON 类的作用主要是用于原始转换。

常见问题

问题一

当使用FastJson时,FastJson 默认过滤 null 值,不显示 null 值字段。

当我们转换JSON字符串时,使用 Feature 枚举值进行设置。

Feature.WriteMapNullValue

如果 Map 中包含 Null 值,则输出,不会过滤

Feature.WriteNullListAsEmpty

如果输出的 List 值为 Null ,则输出 [ ] ,不会输出 Null

Feature.WriteNullStringAsEmpty

如果输出的字符串值为 Null ,则输出 “” ,不会输出 Null

Feature.WriteNullNumberAsZero

如果输出的数字值为 Null ,则输出 0 ,不会输出 Null

Feature.UseSingleQuotes

使用单引号

问题二:

当输出结果与字段定义顺不一致。需要在定义实体类字段时,使用 @JSONField 注解的 ordinal 属性进行顺序配置。

@JSONField(ordinal = 3)
 private String brandName; // 品牌名称
 @JSONField(ordinal = 1)
 private int id; // 品牌编号
 @JSONField(ordinal = 4)
 private String brandLogo; // 品牌LOGO图片地址

问题三:

当输出日期字段时,默认格式不符合需求时,可以在定义实体类的 Date 字段,使用 @JSONField 注解的 format 属性进行格式配置。

@JSONField(ordinal=3,format="yyyy年MM月dd日 HH:mm:ss")
	private LocalDateTime time;