JSON简介
在使用Java进行应用程序的开发中,我们会需要“将Java对象转换成JSON格式”或者“将JSON格式的数据转换为Java对象”,所以我们应该掌握使用第三方库对JSON格式的数据进行解析。
常用的第三方库有如下几种:
- Fastjson
- Jackson
- Gson
- …
今天使用fastjson为大家举例,fastjson是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化为JavaBean。
可在maven中央仓库下载Fastjson:
https://repo1.maven.org/maven2/com/alibaba/fastjson2/fastjson2/2.0.8/
Fastjson中主要是用JSON、JSONObject、JSONArray三个类。其中JSONArray和JSONObject继承JSON。
JSON类
JSON类的作用主要用于原始转换,常用方法有:
- 将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字符串转换为Java对象:
1. JSON.parseObject(String text)
2. JSON.parseArray(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"));
JSONObject类和JSONArray类
JSONObject类主要是用于封装key-value键值对数据,它继承自LinkedHashMap接口,所以对它的理解和使用,可以参考Map集合。JSONArray类主要用于封装数组集合类的数据,它继承自ArrayList类。
将JSON格式的数据,转换成指定的自定义实体类对象。
JSON.parseObject(String text,Class clazz)
代码示例如下:
String json1 = "{\r\n" +
" \"resultcode\": \"200\",\r\n" +
" \"reason\": \"Success\",\r\n" +
" \"result\": {\r\n" +
" \"title\": \"上海市政派出所信息\",\r\n" +
" \"list\": [{\r\n" +
" \"name\": \"文保分局沪东高校派出所\",\r\n" +
" \"addr\": \"中山北一路801号\",\r\n" +
" \"tel\": \"22027732\"\r\n" +
" }, {\r\n" +
" \"name\": \"崇明县公安局汲浜派出所\",\r\n" +
" \"addr\": \"中兴镇北滧公路2179号\",\r\n" +
" \"tel\": \"69444321\"\r\n" +
" }, {\r\n" +
" \"name\": \"崇明县公安局向化派出所\",\r\n" +
" \"addr\": \"陈彷公路4158号\",\r\n" +
" \"tel\": \"59441146\"\r\n" +
" }, {\r\n" +
" \"name\": \"崇明县公安局港沿派出所\",\r\n" +
" \"addr\": \"港沿镇港沿公路1002号\",\r\n" +
" \"tel\": \"59461459\"\r\n" +
" }, {\r\n" +
" \"name\": \"崇明县公安局堡镇港派出所\",\r\n" +
" \"addr\": \"堡镇大通路318号\",\r\n" +
" \"tel\": \"59420110\"\r\n" +
" }, {\r\n" +
" \"name\": \"崇明县公安局竖新派出所\",\r\n" +
" \"addr\": \"竖新镇竖新南路279号\",\r\n" +
" \"tel\": \"59481833\"\r\n" +
" }, {\r\n" +
" \"name\": \"崇明县公安局新河派出所\",\r\n" +
" \"addr\": \"新河镇新开河路627号\",\r\n" +
" \"tel\": \"59681979\"\r\n" +
" }, {\r\n" +
" \"name\": \"崇明县公安局建设派出所\",\r\n" +
" \"addr\": \"建设镇建星路109号\",\r\n" +
" \"tel\": \"59330110\"\r\n" +
" }, {\r\n" +
" \"name\": \"崇明县公安局港西派出所\",\r\n" +
" \"addr\": \"港西镇港东公路887弄6号\",\r\n" +
" \"tel\": \"59671532\"\r\n" +
" }, {\r\n" +
" \"name\": \"崇明县公安局长兴派出所\",\r\n" +
" \"addr\": \"长兴镇海舸路659号\",\r\n" +
" \"tel\": \"56851431\"\r\n" +
" }, {\r\n" +
" \"name\": \"崇明县公安局横沙派出所\",\r\n" +
" \"addr\": \"民东路1588号\",\r\n" +
" \"tel\": \"24060670\"\r\n" +
" }]\r\n" +
" },\r\n" +
" \"error_code\": 0\r\n" +
"}";
JSONObject jsonObj = JSON.parseObject(json1);
JSONObject jsonObjResult = JSON.parseObject(jsonObj.getString("result"));
JSONArray jsonArray = jsonObjResult.getJSONArray("list");
//遍历
//方式一:
for (int i = 0; i < jsonArray.size(); i++) {
JSONObject json = jsonArray.getJSONObject(i);
System.out.println("派出所的名称:"+json.getString("name"));
System.out.println("派出所的地址:"+json.getString("addr"));
System.out.println("派出所的电话:"+json.getString("tel"));
System.out.println();
}
//方式二:
List<PoliceStation> policeStationList = jsonObjResult.getList("list", PoliceStation.class);
System.out.println(policeStationList.size());
for (PoliceStation policeStation : policeStationList) {
System.out.println("派出所的地址:"+policeStation.getAddr());
System.out.println("派出所的名称:"+policeStation.getName());
System.out.println("派出所的电话:"+policeStation.getTel());
System.out.println();
}
1.设置Feature枚举值
使用fastjson默认过滤null值,不显示null值。为了解决此问题,可以使用枚举类Feature。在转换成JSON字符串时,使用Feature枚举值进行设置。
代码示例如下:
Map<String, Object> map = new HashMap<String, Object>(){
{
put("age", 18);
put("name", "张三");
put("sex", null);
}
};
//输出结果为:{"name":"张三","age":18}
System.out.println(JSONObject.toJSONString(map));
Map<String, Object> map = new HashMap<String, Object>(){
{
put("age", 18);
put("name", "张三");
put("sex", null);
}
};
// 使用Feature类型的枚举值进行设置
//输出结果为:{"name":"张三","age":18,"sex":null}
System.out.println(JSONObject.toJSONString(map,Feature.WriteMapNullValue));
2.控制JSON的字段顺序
实体类:
public class PoliceStation {
private String name;
private String addr;
private String tel;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddr() {
return addr;
}
public void setAddr(String addr) {
this.addr = addr;
}
public String getTel() {
return tel;
}
public void setTel(String tel) {
this.tel = tel;
}
}
测试类:
PoliceStation ps = new PoliceStation();
ps.setName("电子城派出所");
ps.setAddr("雁塔区电子二路343号");
ps.setTel("1785243687");
//输出结果:{"addr":"雁塔区电子二路343号","name":"电子城派出所","tel":"1785243687"}
System.out.println(JSON.toJSONString(ps));
使用@JSONField注解的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;
}
3.控制JSON的Date字段格式
实体类:
// 订单类
public class Order{
// 订单编号
private String orderId;
// 创建日期
// 订单类
public class Order{
// 订单编号
private String orderId;
// 创建日期
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime creationTime;
public Order() {
this.orderId = UUID.randomUUID().toString();
this.creationTime = LocalDateTime.now();
}
public String getOrderId() {
return orderId;
}
public void setOrderId(String orderId) {
this.orderId = orderId;
}
public LocalDateTime getCreationTime() {
return creationTime;
}
public void setCreationTime(LocalDateTime creationTime) {
this.creationTime = creationTime;
}
}
测试类:
public class Test {
public static void main(String[] args) {
Order order1 = new Order();
String json = JSON.toJSONString(order1);
//输出结果:{"creationTime":"2022-07-15 21:20:13","orderId":"a09021c8-272c-4559-886f-6f46b9c08c46"}
System.out.println(json);
}
}