一文吃透Json解析工具类合集(FastJsonJacksonGson)

Posted DT辰白

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一文吃透Json解析工具类合集(FastJsonJacksonGson)相关的知识,希望对你有一定的参考价值。


前言

在工作中,少不了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)的主要内容,如果未能解决你的问题,请参考以下文章

一文带你吃透java中的继承

一文吃透接口调用神器RestTemplate

一文吃透电源中的纹波噪声和谐波

一文吃透:Java IO流(输入与输出)轻松掌握核心思路

10张思维导图,一文吃透 Pandas 技术细节

10张思维导图,一文吃透 Pandas 技术细节