JSON简介
JSON 是一种轻量级的数据交换格式。它基于ECMAScript的一个子集,采用完全独立于编程语言的文本格式来储存和表示数据。简洁和清晰的层次结构使得JSON成为理想的数据交换语言。易于人们的阅读和编写,同时也易于机器的解析和生产,并有效地提升网络传输效率。
在json中通常是使用{}来保存对象的,每个对象是由若干的数据(由key:value)组成。
用Java解析JSON时,以fastjson为例:
fastjson是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将java Bean 序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean。但是在使用Fastjson时,要先在java中导包(将相关的包加到工作空间中)。
fastjson最常用的就是这三个类,它们的关系情况如图:
序列化
将Java对象序列化转换为JSON字符串:
方法:
JSON.toJSONString(Object object)
// 实体数据
Weather weather = new Weather();
weather.setCity("西安");
weather.setComfort_index("非常舒适");
weather.setDate_y("2022年07月10日");
// 转换为json格式的字符串
String json = JSON.toJSONString(weather);
System.out.println(json);
注解:如果需要自定义json中的key,可以使用@JSONField注解在成员变量进行设置。
反序列化
将JSON字符串反序列化为Java对象:
方法:
JSON.parseObject(String text)
// json格式数据
String jsonStr = "{\"temperature\":\"29℃~41℃\",\"weather\":\"多云转阴\",\"weather_id\":{\"fa\":\"01\",\"fb\":\"02\"},\"wind\":\"东北风微风\",\"week\":\"星期日\",\"city\":\"西安\",\"date_y\":\"2022年07月10日\",\"dressing_index\":\"炎热\",\"dressing_advice\":\"天气炎热,建议着短衫、短裙、短裤、薄型T恤衫等清凉夏季服装。\",\"uv_index\":\"中等\",\"comfort_index\":\"\",\"wash_index\":\"较适宜\",\"travel_index\":\"较不宜\",\"exercise_index\":\"较不宜\",\"drying_index\":\"\"}";
// 转换成JSONObject
JSONObject jsonObj = JSON.parseObject(jsonStr);
System.out.println("日期:" + jsonObj.getString("date_y"));
System.out.println("城市:" + jsonObj.getString("city"));
System.out.println("天气:" + jsonObj.getString("weather"));
System.out.println("温度:" + jsonObj.getString("temperature"));
方法:
JSON.parseArray(String text)
// json格式数据
String jsonStr = "[{ \"name\": \"文保分局沪东高校派出所\", \"addr\": \"中山北一路801号\", \"tel\": \"22027732\" }, { \"name\": \"文保分局沪西高校派出所\", \"addr\": \"芙蓉江路55号\", \"tel\": \"62751704\" }, { \"name\": \"水上公安局吴淞水上派出所\", \"addr\": \"淞浦路187号\", \"tel\": \"56671442\" }, { \"name\": \"水上公安局杨浦水上派出所\", \"addr\": \"杨树浦路1291号\", \"tel\": \"65898004\" }, { \"name\": \"水上公安局外滩水上派出所\", \"addr\": \"中山东二路8弄3号\", \"tel\": \"63305388\" }, { \"name\": \"水上公安局石洞口水上派出所\", \"addr\": \"盛石路18号\", \"tel\": \"56152176\" }, { \"name\": \"轨道分局上海火车站站派出所\", \"addr\": \"共和新路2838号\", \"tel\": \"56650472\" }]";
// 转换成JSONArray
JSONArray jsonArray = JSON.parseArray(jsonStr);
// 遍历JSONArray
for(int i =0 ; i <jsonArray.size(); i++) {
JSONObject item = jsonArray.getJSONObject(i);
System.out.println(item);
}
JavaObject类
JavaObject类主要用于封装key-value键值对数据,它继承自LinkedHashMap接口。
可以将JSON格式的数据,转换成指定的自定义实体类对象。
JSON.parseObject(String text,Class<T> calzz)
JAONArray类
JSANArray类主要用于封装数组集合类的数据,它继承自ArrayList类。
将JSON格式的数据,转换成指定的泛型集合。
JSON.parseArray(String text,Class<T> clazz)
常见问题
**一、**FastJson默认过滤null值,不显示null值字段。(解决方法:转换成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));
**二、** 控制JSON的字段顺序
(使用@JSONFiled注解的ordinal属性进行配置)。
import com.alibaba.fastjson2.annotation.JSONField;
public class PoliceStation {
@JSONField(ordinal = 1)
private String name;
@JSONField(ordinal = 2)
private String addr;
@JSONField(ordinal = 3)
private String tel;
}
**三、** 控制JSON的Date字段格式。
(使用@JSONFiled注解的format属性进行格式配置)。
// 订单类
public class Order{
// 订单编号
private String orderId;
// 创建日期
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime creationTime;
}