一、JSON解析

1.简介:JSON是一种轻量级的数据交换格式

2.Java解析JSON:

    序列化:将Java对象转换成JSON格式的数据

    反序列化:将JSON格式的数据转换成Java对象

import com.alibaba.fastjson2.JSON;
import com.apesource.entity.PoliceStation;

public class Test01 {
	public static void main(String[] args) {
		 PoliceStation ps1 = new PoliceStation();
		 ps1.setName("电子城派出所");
		 ps1.setAddr("西安市电子二路7645号");
		 ps1.setTel("17762138888");
		 
		 // 序列化:将java对象转换成json格式的数据
		 String json1 = JSON.toJSONString(ps1);
		 System.out.println(json1);
		 
		 //反序列化
		 String jsonStr = "{\"addr\":\"西安市电子二路7645号\",\"name\":\"电子城派出所\",\"tel\":\"17762138888\"}";
		 PoliceStation ps2 = JSON.parseObject(jsonStr,PoliceStation.class);
		 System.out.println(ps2);	 
	}
}

输出结果: 

{"addr":"西安市电子二路7645号","name":"电子城派出所","tel":"17762138888"}
PoliceStation [name=电子城派出所, addr=西安市电子二路7645号, tel=17762138888]

面对以上需求,我们需要掌握如何使用第三方库来进行JSON格式数据的解析

3.最常用的第三方库:Fastjson(阿里巴巴开源的JSON解析库)

Fastjson主要对象:JSON、JSONObject、JSONArray

JSONObject和JSONArray继承JSON

(1)JSON类

  • 将Java对象"序列化"转换为JSON字符串:JSON.toString(Object object)
  • 将JSON字符串反序列化为Java对象:  JSON.parseObject(String text)                                                                                                    JSON.parseArray(String text)

(2)JSONObject类

主要封装key-value键值对数据,继承自LinkedHashMap接口 

  • 将JSON格式的数据,转换成指定的自定义实体类对象:                                                                                                                     JSON.parseObject(String text,Class<T>  clazz) 

(3)JSONArray类

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

  •  将JSON格式的数据,转换成指定的泛型集合:JSON.parseArray(String text,Class<T> clazz

4.常见问题

问题1:FastJson默认过滤null值,不显示null值字段

Map<String, Object> map = new HashMap<String, Object>(){
    {
        put("age", 18);
        put("name", "张三");
        put("sex", null);
    }
};
System.out.println(JSONObject.toJSONString(map));

  输出结果 :

{"name":"张三","age":18}

【解决】:转换成JSON字符串时,使用Feature枚举值进行设置 

Map<String, Object> map = new HashMap<String, Object>(){
    {
        put("age", 18);
        put("name", "张三");
        put("sex", null);
    }
};
// 使用Feature类型的枚举值进行设置
System.out.println(JSONObject.toJSONString(map,Feature.WriteMapNullValue));

 问题2:控制JSON字段顺序

【解决】:输出结果与字段定义顺序不一致。可以在定义实体类字段时,使用@JSONFied注解ordinal属性进行配置。

public class PoliceStation {
	@JSONField(ordinal = 1)
	private String name;
	
	@JSONField(ordinal = 2)
	private String addr;
	
	@JSONField(ordinal = 3)
	private String tel;
}

问题3:控制JSON的Date字段格式

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

// 订单类
public class Order{
	// 订单编号
	private String orderId;
	
	// 创建日期
	@JSONField(format = "yyyy-MM-dd HH:mm:ss")
	private LocalDateTime creationTime;
}

 

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐