什么是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;