java工具 - FastJson是这样用的
好烦啊,怎么才能在3秒内学会使用FastJson呢
一、FastJson简介
FastJson是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java类转换为JSON字符串,也可以将JSON字符转换为Java类。
FastJson优点:速度快、使用广泛、测试完备、使用简单、功能完备。(GitHub地址)
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.62</version> <!--本文中所有相关代码使用此版本Java包-->
</dependency>
二、Json解析
模板数据:
{
"status": 0,
"deploy": true,
"date": "2019-11-11 10:52:27.811321",
"message": "complex vehicle json sample",
"data": {
"archived": false,
"creator": "Anchor",
"time": "2019-11-11 11:30:26",
"brands": [
{
"id": 1205231,
"type": "LUXURY",
"name_zh": "奔驰",
"name_en": "Benz",
"createDate": "1844-11-25",
"subsidiary": ["smart", "GLC", "GLA"],
"popular": [{
"model": "S350L",
"color": "White"
},
{
"model": "C260",
"color": "Silver"
}]
},
{
"id": 1324561,
"type": "REALISTIC",
"name_zh": "长安",
"name_en": "CHANGAN",
"createDate": "1996-10-31",
"subsidiary": ["Passenger", "SUV", "MPV"],
"popular": [{
"model": "CS75",
"color": "Red"
},
{
"model": "XT",
"color": "Black"
}]
}
]
}
}
1.介绍三个类
1)JSON类
Json转换器(解析器),将Json文本转换成Json对象(JSONObject和JSONArray等)或Java对象,也可将Json、Java对象转换成Json文本。
2)JSONObject类
由Json文本转换成的Json对象,可从中读取Json文本中的数据。
3)JSONArray类
由Json文本转换成的Json对象,与JSONObject不同的是JSONArray是个数组。遍历时将JSONArray中的每个元素转换成JSONObject,然后读取数据。
2.简单的读
核心点
是,将Json文本转换成JSONObject,然后根据元素名从JSONObject中get数据。
常用的get方法
,注意getXXX()一般返回引用类型,而对应的getXXXValue()一般返回基本类型,XXX为也可为Short、Float等,下表只是常用的一部分。
1)读取单层元素
下例为简单读取sample中的status、message、deploy、date四个元素。
JSONObject jsonObject = JSON.parseObject(sample); //sample为存储模板数据的String
int status = jsonObject.getIntValue("status"); //getXXXValue()获取到基本类型
String message = jsonObject.getString("message");
Boolean deploy = jsonObject.getBoolean("deploy"); //getXXX()获取到引用类型
Date date = jsonObject.getDate("date"); //可直接取出Date类型的时间
2)读取多层元素
多层实际上和单层一样,都是从JSONObject中获取数据,先一步一步将要获取的元素的上层转换成JSONObject,然后直接读就可以了。
例如下例中先将data这个节点转换成JSONObject,再去读取archived、creator、time中的数据。若Json有三层、四层等依次类推即可。
JSONObject jsonObject = JSON.parseObject(sample); //第一步,将Json转换成JSONObject
JSONObject data = jsonObject.getJSONObject("data"); //第二步,将data元素转换成JSONObject
boolean archived = data.getBooleanValue("archived"); //第三步,取出数据
String creator = data.getString("creator");
Date time = data.getDate("time");
3)读取数组
先使用getJSONArray()取到待解析的数组,然后遍历该JSONArray,将其中的每个元素转换成JSONObject,然后从JSONObject中读取相应数据。
若此时的JSONObject还是一个数组,继续将其中的元素转换成JSONObject。
下例展示了如何获取模板数据中所有的subsidiary(数组中嵌套着数组)。
JSONObject jsonObject = JSON.parseObject(sample); //第一步,将Json转换成JSONObject
JSONObject data = jsonObject.getJSONObject("data"); //第二步,将data元素转换成JSONObject
JSONArray brands = data.getJSONArray("brands"); //第三步,将brands转换成JSONArray
List<String> allSubsidiary = new ArrayList<>();
for (int i = 0; i < brands.size(); i++) { //遍历brands
JSONObject brand = brands.getJSONObject(i); //将brands数组中每个元素转换成JSONObject
JSONArray subsidiary = brand.getJSONArray("subsidiary"); //第四步,将subsidiary转换成JSONArray
for (int j = 0; j < subsidiary.size(); j++) { //遍历subsidiary
String finalData = subsidiary.getString(j); //第五步,取数据
allSubsidiary.add(finalData);
}
}
System.out.println(allSubsidiary); //运行结果:[smart, GLC, GLA, Passenger, SUV, MPV]
3.解析为Java类
分为两类,一类是将JSONObject转换成Java类,另一类是将JSONArray转换成Java类。
分别调用JSON.parseObject(String text, Class<T> clazz)
和JSON.parseArray(String text, Class<T> clazz)
方法。
下例展示如何将模板数据中的brands元素转换成Java类:
JSONObject jsonObject = JSON.parseObject(sample);
JSONObject data = jsonObject.getJSONObject("data");
JSONArray brands = data.getJSONArray("brands"); //照例先获取到brands,注意它是JSONArray
List<Brand> brandList = JSON.parseArray(brands.toString(), Brand.class); //指定解析的String和Class
·Brand类
public class Brand {
private Integer id;
private String type;
private String nameZh; //支持驼峰命名,也支持下划线命名
private String name_en; //nameEn也可解析成功
private Date createDate;
private List<String> subsidiary;
private List<Popular> popular;
} //get、set方法省略
·Popular类
public class Popular {
private String model;
private String color;
} //get、set方法省略
注意:
1)若Java类中某个属性无setter方法,则最终无法将json中对应的元素解析为该属性。(例如id无setter方法,最终得到的id为null)
2)FastJson支持驼峰命名。Json中有个元素名为name_zh,类中属性名为name_zh和nameZh都可解析成功。
·Popular类也可换为Map<String,String>
public class Brand {
private Integer id;
private String type;
private String nameZh;
private String name_en;
private Date createDate;
private List<String> subsidiary;
private List<Map<String,String>> popular;
} //get、set方法省略
解析结果:
三、Java类转Json
String jsonString = JSON.toJSONString(brandList);
完事!