1.什么是Json
JSON是一种取代XML的数据结构,和xml相比,它更小巧但描述能力却不差,由于它的小巧所以网络传输数据将减少更多流量从而加快速度。
JSON就是一串字符串 只不过元素会使用特定的符号标注。
{} 双括号表示对象
[] 中括号表示数组
“” 双引号内是属性或值
: 冒号表示后者是前者的值(这个值可以是字符串、数字、也可以是另一个数组或对象)
所以 {“name”: “Michael”} 可以理解为是一个包含name为Michael的对象
2.Json解析四种方式
2.1传统方式json-lib
导入依赖:
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.4</version>
<classifier>jdk15</classifier>
</dependency>
实体类转换为json字符串
实体类:
public class User {
private Integer age;
private String name;
private String password;
public User() {}
public User(Integer age, String name, String password) {
this.age = age;
this.name = name;
this.password = password;
}
}
Json测试类:
public class JsonTest {
/**
* 传统方式解析:实体类转换为Json格式字符串
*/
private static void tranBeanToJson() {
User user = new User(18, "zzc", "666");
JSONObject json = new JSONObject();
json.put("age", user.getAge());
json.put("name", user.getName());
json.put("password", user.getPassword());
System.out.println(json.toString());
}
/**
* 传统方式解析
*/
public static void tranditioalResolve() {
tranBeanToJson();
}
public static void main(String[] args) {
tranditioalResolve();
}
}
Json格式字符串转换为实体类
/**
* 传统方式解析:Json格式字符串转换为实体类
*/
private static void tranJsonToBean() {
String jsonStr = "{\"age\" :20, \"name\": \"zzc\", \"password\": \"123\"}";
JSONObject json = JSONObject.fromObject(jsonStr);
User user = (User) json.toBean(json, User.class);
System.out.println(user);
}
public static void tranditioalResolve() {
//tranBeanToJson();
tranJsonToBean();
}
若Json字符串中包含数组
添加Address类:
public class Address {
private String province;
private String city;
private String block;
private Integer street;
public Address() {}
public Address(String province, String city, String block, Integer street) {
this.province = province;
this.city = city;
this.block = block;
this.street = street;
}
}
并把Address类作为User类的一个属性。修改User类为:
public class User {
private Integer age;
private String name;
private String password;
// 一个用户可以有多个地址
private List<Address> addressList;
}
private static void tranJsonToBean() {
String jsonStr = "{\"age\":20, \"name\":\"zzc\", \"password\":\"123\", \"addressList\":" +
"[{\"province\": \"湖北省\", \"city\":\"武汉市\", \"block\":\"东西湖区\", \"street\": \"556\"}," +
"{\"province\": \"黑龙江省\", \"city\":\"哈尔滨市\", \"block\":\"道里区\", \"street\": \"36\"}]}";
JSONObject json = JSONObject.fromObject(jsonStr);
Map classMap = new HashMap<>();
classMap.put("addressList", Address.class);
User user = (User) json.toBean(json, User.class, classMap);
System.out.println(user);
}
上述addressList就是一个数组。此时,需要用一个Map进行组装。这样,User对象中的addressList属性就被赋值了。
也可通过方法getJSONArray()方法获取addressList的值:
JSONArray addressList = json.getJSONArray("addressList");
System.out.println(addressList);
2.2Jackson方式
导入依赖:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.10.0</version>
</dependency>
实体类转换为Json格式
private static void jacksonBeanToJson() throws Exception{
User user = new User(18, "zzc", "666");
ObjectMapper objectMapper = new ObjectMapper();
String jsonStr = objectMapper.writeValueAsString(user);
System.out.println(jsonStr);
}
public static void jacksonResolve() {
try {
jacksonBeanToJson();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
jacksonResolve();
}
Json格式字符串转换为实体类
private static void jacksonJsonToBean() throws Exception{
String jsonStr = "{\"age\" :20, \"name\": \"zzc\", \"password\": \"123\"}";
ObjectMapper objectMapper = new ObjectMapper();
User user = objectMapper.readValue(jsonStr, User.class);
System.out.println(user);
}
2.3Gson解析
导入依赖:
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.5</version>
</dependency>
实体类转换为Json格式
private static void gsonBeanToJson() {
User user = new User(18, "zzc", "666");
Gson gson = new Gson();
String jsonStr = gson.toJson(user);
System.out.println(jsonStr);
}
Json格式字符串转换为实体类
private static void gsonJsonToBean() {
String jsonStr = "{\"age\" :20, \"name\": \"zzc\", \"password\": \"123\"}";
Gson gson = new Gson();
User user = gson.fromJson(jsonStr, User.class);
System.out.println(user);
}
2.4fastjson解析
导入依赖:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
实体类转换为Json格式
private static void fastJsonBeanToJson() {
User user = new User(18, "zzc", "666");
Object jsonStr = JSON.toJSON(user);
System.out.println(jsonStr);
}
Json格式字符串转换为实体类
private static void fastJsonToBean() {
String jsonStr = "{\"age\" :20, \"name\": \"zzc\", \"password\": \"123\"}";
User user = JSON.parseObject(jsonStr, User.class);
System.out.println(user);
}
3.四种解析方式比较
3.1json-lib
json-lib最开始、也是应用最广泛的json解析工具,json-lib 不好的地方确实是依赖于很多第三方包(包括commons-beanutils.jar,commons-collections-3.2.jar,commons-lang-2.6.jar,commons-logging-1.1.1.jar,ezmorph-1.0.6.jar)对于复杂类型的转换,json-lib对于json转换成bean还有缺陷,比如一个类里面会出现另一个类的list或者map集合,json-lib从json到bean的转换就会出现问题。
json-lib在功能和性能上面都不能满足现在互联网化的需求。
3.2开源的Jackson
相比json-lib框架,Jackson所依赖的jar包较少,简单易用并且性能也要相对高些。而且Jackson社区相对比较活跃,更新速度也比较快。
Jackson对于复杂类型的json转换bean会出现问题,一些集合Map,List的转换出现问题。Jackson对于复杂类型的bean转换Json,转换的json格式不是标准的Json格式
3.3Google的Gson
Gson是目前功能最全的Json解析神器.Gson的应用主要为toJson与fromJson两个转换函数,无依赖,不需要例外额外的jar,能够直接跑在JDK上。类里面只要有get和set方法,Gson完全可以将复杂类型的json到bean或bean到json的转换,是JSON解析的神器。
Gson在功能上面无可挑剔,但是性能上面比FastJson有所差距。
3.4阿里巴巴的FastJson
Fastjson是一个Java语言编写的高性能的JSON处理器,由阿里巴巴公司开发。无依赖,不需要例外额外的jar,能够直接跑在JDK上。
FastJson在复杂类型的Bean转换Json上会出现一些问题,可能会出现引用的类型,导致Json转换出错,需要制定引用。
FastJson采用独创的算法,将parse的速度提升到极致,超过所有json库。
解析类型 | 优缺点 |
---|---|
json-lib | 复杂的Json数据转换成实体类存在缺陷,性能和功能不够完善 |
Jackson | 复杂的Json数据转换成实体类存在缺陷,性能和功能优于传统方式 |
Gson | 功能方面在几种方式中最优,性能方面不如Jackson方式 |
FastJson | 复杂的实体类转换成Json数据存在缺陷,解析json的速度优于其他方式 |
来源:CSDN
作者:菩提小猿
链接:https://blog.csdn.net/Lucky_Boy_Luck/article/details/104732861