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类主要用于封装key-value键值对数据,它继承自LinkedHashMap接口。 可以将JSON格式的数据,转换成指定的自定义实体类对象。
JSON.parseObject(String text,Class<T> calzz)
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;
}