一文吃透Json解析工具类合集(FastJsonJacksonGson)
Posted DT辰白
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一文吃透Json解析工具类合集(FastJsonJacksonGson)相关的知识,希望对你有一定的参考价值。
Json解析工具类
前言
在工作中,少不了Json解析处理,一般我们常用的就是FastJson、Jackson、Gson这三大工具类,他们都有各自的优缺点,本篇文章我们来使用一下他们各自的API,对比一下。
一、各个JSON技术的简介
1.1 FastJson角色
fastjson是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean。
Github官网简介:https://github.com/alibaba/fastjson/wiki/Quick-Start-CN
1.2 Jackson角色
Jackson被称为“ Java JSON库”或“ Java的最佳JSON解析器”。或简称为“ JSON for Java”。
Github官网简介:https://github.com/FasterXML/jackson
1.3 Gson角色
Gson是一个Java库,可用于将Java对象转换为其JSON表示形式。它也可以用于将JSON字符串转换为等效的Java对象。Gson可以处理任意Java对象,包括您没有源代码的预先存在的对象。
Github官网简介:https://github.com/google/gson
二、使用步骤
2.1 引入库
1、FastJson依赖
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.75</version>
</dependency>
Maven中央仓库:https://mvnrepository.com/artifact/com.alibaba/fastjson/1.2.75
2、Jackson依赖
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-annotations -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.12.1</version>
</dependency>
Maven中央仓库:https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-annotations/2.12.1
3、Gson依赖
<!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.6</version>
</dependency>
Maven中央仓库:https://mvnrepository.com/artifact/com.google.code.gson/gson/2.8.6
2.2 将JSON 字符串转换为Java 对象
Person对象
/**
* @author DT开发者
*/
@Data
@EqualsAndHashCode(callSuper = false)
@AllArgsConstructor
@NoArgsConstructor
public class Person implements Serializable {
private Integer id;
private String name;
private Date createTime;
}
1、FastJson版本
public static void main(String[] args) {
String json = "{\\"createTime\\":1621341922450,\\"id\\":1,\\"name\\":\\"DT\\"}";
// 方式1: 将json字符串转为Java对象
Person person = JSON.parseObject(json,Person.class);
System.out.println("java对象->>>"+person);
System.out.println("=========================================================");
// 方式2: 将json字符串转为Java对象
Person newPerson2 = JSONObject.parseObject(json, Person.class);
System.out.println("java对象->>>"+newPerson2);
}
JSON.parseObject(String,Object.class)
JSONObject.parseObject(String, Object.class)
2、Jackson版本
public static void main(String[] args) {
// 创建Jackson核心对象 ObjectMapper
ObjectMapper objectMapper = new ObjectMapper();
String json = "{\\"createTime\\":1621341922450,\\"id\\":1,\\"name\\":\\"DT\\"}";
try {
Person person = objectMapper.readValue(json, Person.class);
System.out.println("java对象->>>"+person);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
}
3、Gson版本
public static void main(String[] args) {
// gson无法正常将时间戳转化成date
// 使用JSON内存树注册Date类型
final Gson gson = new GsonBuilder()
.registerTypeAdapter(Date.class, new JsonDeserializer<Date>() {
@Override
public Date deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext context) throws JsonParseException {
return new Date(jsonElement.getAsJsonPrimitive().getAsLong());
}
}).create();
String json = "{\\"createTime\\":1621341922450,\\"id\\":1,\\"name\\":\\"DT\\"}";
Person person = gson.fromJson(json, Person.class);
System.out.println("java对象->>>"+person);
}
2.3 将Java对象转换为JSON 字符串
1、FastJson版本
public static void main(String[] args) {
Person person = new Person(1,"DT",new Date());
// 方式1:将对象转为json字符串
String json = JSON.toJSONString(person);
System.out.println("json字符串->>>"+json);
System.out.println("=========================================================");
// 方式2:将对象转为json字符串
String json2 = JSONObject.toJSONString(person);
System.out.println("json字符串->>>"+json2);
}
JSONObject.toJSONString(String)
JSON.toJSONString(String)
2、Jackson版本
public static void main(String[] args) {
// 创建Jackson核心对象 ObjectMapper
ObjectMapper objectMapper = new ObjectMapper();
Person person = new Person(1,"DT",new Date());
try {
String json = objectMapper.writeValueAsString(person);
System.out.println("json字符串->>>"+json);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
}
3、Gson版本
public static void main(String[] args) {
Gson gson = new Gson();
Person person = new Person(1,"DT",new Date());
String json = gson.toJson(person);
System.out.println("json字符串->>>"+json);
}
2.4 将JSON 字符串数组转为JSON数组
1、FastJson版本
public static void main(String[] args) {
List<Person> personList = new ArrayList<>();
personList.add(new Person(1,"DT",new Date()));
personList.add(new Person(2,"DT1",new Date()));
personList.add(new Person(3,"DT2",new Date()));
String json = JSONObject.toJSONString(personList);
JSONArray jsArr = JSONObject.parseArray(json);
System.out.println(jsArr);
}
JSONObject.parseArray(json)
遍历循环Json数组:
public static void main(String[] args) {
List<Person> personList = new ArrayList<>();
personList.add(new Person(1,"DT",new Date()));
personList.add(new Person(2,"DT1",new Date()));
personList.add(new Person(3,"DT2",new Date()));
String json = JSONObject.toJSONString(personList);
JSONArray jsArr = JSONObject.parseArray(json);
// 遍历方式1
jsArr.stream().forEach(json1 ->{
System.out.println(json1.toString());
});
// 遍历方式2
for (Object o : jsArr) {
JSONObject obj = (JSONObject) o;
System.out.println("取到id->>>" + obj.get("id"));
// 判断是否存在key
System.out.println("key是否存在->>>"+obj.containsKey("name1"));
// 判断是否存在值
System.out.println("value是否存在->>>"+obj.containsValue(obj.get("id")));
}
}
2、Jackson版本
public static void main(String[] args) throws JsonProcessingException {
// 将JSON数组转换为array对象
ObjectMapper mapper = new ObjectMapper();
String json = "[{\\"id\\":1,\\"name\\":\\"张三\\",\\"createTime\\":1622719597081}, {\\"id\\":2,\\"name\\":\\"李四\\",\\"createTime\\":1622719597081}]";
// 方式1
Person[] pp1 = mapper.readValue(json, Person[].class);
for (Person person : pp1) {
System.out.println(person);
}
// 方式2
List<Person> ppl2 = Arrays.asList(mapper.readValue(json, Person[].class));
ppl2.stream().forEach(System.out::println);
// 方式3
List<Person> pp3 = mapper.readValue(json, new TypeReference<List<Person>>() {});
pp3.stream().forEach(System.out::println);
}
3、Gson版本
```java
public static void main(String[] args) {
// gson无法正常将时间戳转化成date
// 使用JSON内存树注册Date类型
final Gson gson = new GsonBuilder()
.registerTypeAdapter(Date.class, new JsonDeserializer<Date>() {
@Override
public Date deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext context) throws JsonParseException {
return new Date(jsonElement.getAsJsonPrimitive().getAsLong());
}
}).create();
String json = "[{\\"id\\":1,\\"name\\":\\"张三\\",\\"createTime\\":1622719597081}, {\\"id\\":2,\\"name\\":\\"李四\\",\\"createTime\\":1622719597081}]";
Type type = new TypeToken<ArrayList<Person>>(){}.getType();
List<Person> personList = gson.fromJson(json, type);
personList.stream().forEach(System.out::println);
}
List反序列化时必须提供它的Type,通过Gson提供的TypeToken.getType()方法可以定义当前List的Type。
2.5 将JSON数组转为JSON 字符串
1、FastJson版本
public static void main(String[] args) {
List<Person> personList = new ArrayList<>();
personList.add(new Person(1,"DT",new Date()));
personList.add(new Person(2,"DT1",new Date()));
personList.add(new Person(3,"DT2",new Date()));
String json = JSONObject.toJSONString(personList);
System.out.println("json->>>"+json);
}
2、Jackson版本
public static void main(String[] args) throws JsonProcessingException {
ObjectMapper objectMapper = new ObjectMapper();
List<Person> personList = new ArrayList<>();
personList.add(new Person(1,"DT",new Date()));
personList.add(new Person(2,"DT1",new Date()));
personList.add(new Person(3,"DT2",new Date()));
String json = objectMapper.writeValueAsString(personList);
System.out.println("json->>>"+json);
}
3、Gson版本
public static void main(String[] args) {
Gson gson = new Gson()以上是关于一文吃透Json解析工具类合集(FastJsonJacksonGson)的主要内容,如果未能解决你的问题,请参考以下文章