对于每个开发web的人来说,JSON肯定都不陌生.它的轻量级与简洁性,使得它备受青睐.同时,随着前后台技术的不断成熟,Json解析技术也发展地越来越完善.在这众多的Json解析技术中,备受欢迎的则是我们今天要讲的以下三种:
-
Jackson
-
Gson
-
json-b
1.jackson
Jackson是一个简单基于Java应用库,Jackson可以轻松的将Java对象转换成json对象和xml文档,同样也可以将json、xml转换成Java对象。Jackson所依赖的jar包较少,简单易用并且性能也要相对高些,并且Jackson社区相对比较活跃,更新速度也比较快。从SpringMVC到SpringBoot,官方推荐的都是jackson.,它主要具备以下几个优点:容易使用。
-
容易使用 - jackson API提供了一个高层次外观,以简化常用的用例。
-
无需创建映射 - API提供了默认的映射大部分对象序列化。
-
性能高 - 快速,低内存占用,适合大型对象图表或系统。
-
干净的JSON - jackson创建一个干净和紧凑的JSON结果,这是让人很容易阅读。
-
不依赖 - 库不需要任何其他的库,除了JDK。
-
开源代码 - jackson是开源的,可以免费使用。
1.1 jackson的常规使用
对于我们而言,我们比较关心的是他的序列化操作,这里我们先引入jackson的依赖包
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
构建成功后,我们看到依赖里出现了:
jackson-annotations-2.9.0.jar
jackson-core-2.9.7.jar
jackson-databind-2.9.7.jar
这是jackson的依赖库,接下来我们创建一个基本的实体类:
package top.lianmengtu.testjson.domain;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class UserInfo {
private Long id;
private String nickName;
private Boolean gender;
}
我们来一个测试类:
package top.lianmengtu.testjson;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import top.lianmengtu.testjson.domain.UserInfo;
public class MyJsonTest {
public static void main(String[] args) {
ObjectMapper objectMapper=new ObjectMapper();
UserInfo userInfo = new UserInfo();
userInfo.setId(1l);
userInfo.setNickName("Nick");
userInfo.setGender(false);
String userInfoString= null;
try {
userInfoString = objectMapper.writeValueAsString(userInfo);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
System.out.println(userInfoString);
}
}
运行结果如下:
{"id":1,"nickName":"Nick","gender":false}
这是一个基本类型,我们这里添加两个属性,一个基本类型的List,另一个是日期类型:
package top.lianmengtu.testjson.domain;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.Getter;
import lombok.Setter;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
@Getter
@Setter
public class UserInfo {
private Long id;
private String nickName;
private Boolean gender;
private List<String> roleList;
private Date createTime;
}
测试类如下:
package top.lianmengtu.testjson;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import top.lianmengtu.testjson.domain.UserInfo;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class MyJsonTest {
public static void main(String[] args) {
ObjectMapper objectMapper =new ObjectMapper();
UserInfo userInfo = new UserInfo();
userInfo.setId(1l);
userInfo.setNickName("Nick");
userInfo.setGender(false);
List<String> roleList=new ArrayList<>();
roleList.add("admin");
roleList.add("manager");
userInfo.setRoleList(roleList);
userInfo.setCreateTime(new Date());
String userInfoString= null;
try {
userInfoString = objectMapper.writeValueAsString(userInfo);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
System.out.println(userInfoString);
}
}
运行结果如下:
{"id":1,"nickName":"Nick","gender":false,"roleList":["admin","manager"],"createTime":1540451548817}
这里我们看到基本类型的List按着我们的期望解析了,但日期明显不是我们想要的,这里我们可以使用@JsonFormat来传入我们想要的格式,如下所示:
package top.lianmengtu.testjson.domain;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.Getter;
import lombok.Setter;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
@Getter
@Setter
public class UserInfo {
private Long id;
private String nickName;
private Boolean gender;
private List<String> roleList;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
}
这里我们的测试类不变,运行结果如下所示:
{"id":1,"nickName":"Nick","gender":false,"roleList":["admin","manager"],"createTime":"2018-10-25 07:16:12"}
此时,我们看到日期类型已经按着我们期望的格式进行展示了.我们在使用的时候,常会使用内嵌类型,这里我们给用户定义一个公司:
package top.lianmengtu.testjson.domain;
import lombok.Getter;
import lombok.Setter;
@Setter
@Getter
public class Company {
private Long id;
private String name;
private String address;
}
我们再给用户定义一个公司列表,表明用户工作过的公司:
package top.lianmengtu.testjson.domain;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.Getter;
import lombok.Setter;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
@Getter
@Setter
public class UserInfo {
private Long id;
private String nickName;
private Boolean gender;
private List<String> roleList;
private List<Company> companies;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
}
我们也修改一下测试类:
package top.lianmengtu.testjson;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import top.lianmengtu.testjson.domain.Company;
import top.lianmengtu.testjson.domain.UserInfo;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class MyJsonTest {
public static void main(String[] args) {
ObjectMapper objectMapper =new ObjectMapper();
UserInfo userInfo = new UserInfo();
userInfo.setId(1l);
userInfo.setNickName("Nick");
userInfo.setGender(false);
List<String> roleList=new ArrayList<>();
roleList.add("admin");
roleList.add("manager");
userInfo.setRoleList(roleList);
Company baidu=new Company();
baidu.setId(1l);
baidu.setName("百度");
baidu.setAddress("西二旗");
List<Company> companies = new ArrayList<>();
comp