zoukankan      html  css  js  c++  java
  • Java中常用JSON解析利器

    1. JSON 是什么

    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于阅读和编写,机器解析和生成起来更是轻而易举。JSON 采用了完全独立于编程语言的文本格式,但它的格式非常符合 C 语言家族的习惯(比如 C、C++、C#、Java、JavaScript、Python 等)。 这种特质使得 JSON 成为了最理想的数据交换格式。

    JSON 建构于两种常见的数据结构:

    • “键/值”对。
    • 数组。

    最常用的JSON解析利器有:Gson、Jackson、阿里巴巴的 Fastjson

    2. Gson 

    Gson 是谷歌提供的一个开源库,可以将 Java 对象序列化为 JSON 字符串,同样可以将 JSON 字符串反序列化(解析)为匹配的 Java 对象。

    使用 Gson 之前,需要先在项目中引入 Gson 的依赖。

    <!--Gson 依赖-->
    <dependency>
        <groupId>com.google.code.gson</groupId>
        <artifactId>gson</artifactId>
        <version>2.8.6</version>
    </dependency>
            
    

    1)准备数据 Person 类

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    @ToString
    static class Person {
        private Integer age;
        private String username;
    }

    2)Gson 简单使用

    // Gson 的简单使用
    private static void method1() {
        Gson gson = new Gson();
        gson.toJson(18);            // 18
        gson.toJson("沉默王二");     // 沉默王二
    }
    
    // 对象转 Json
    private static void method2() {
        Gson gson = new Gson();
        String json = gson.toJson(new Person(18, "王二"));
        System.out.println(json);
    }
    
    // 数组与 Json 之间的相互转换
    private static void method3() {
        Gson gson = new Gson();
        int[] ints = {1, 2, 3, 4, 5};
        String[] strings = {"沉", "默", "王二"};
        // 转成 JSON 字符串
        gson.toJson(ints);     //  ==> [1,2,3,4,5]
        gson.toJson(strings);  //  ==> ["沉", "默", "王二"]
        //  解析为数组
        int[] ints2 = gson.fromJson("[1,2,3,4,5]", int[].class);
        String[] strings2 = gson.fromJson("["沉", "默", "王二"]", String[].class);
    }
    
    // 集合转 Json 字符串,Json 字符串转集合
    private static void method4() {
        // 集合转Json字符串
        Gson gson = new Gson();
        List<String> list = Lists.newArrayList("沉默", "王二");
        String json = gson.toJson(list);
        System.out.println("集合转 Json 字符串: " + json);
    
        // Json 字符串转集合
        Type collectionType = new TypeToken<List<String>>() {}.getType();
        List<String> list2 = gson.fromJson(json, collectionType);
        System.out.println("Json 字符串转集合: " + list2);
    }

      字符串转集合时,我们需要借助 com.google.gson.reflect.TypeTokenjava.lang.reflect.Type 来获取集合的类型,再将其作为参数传递给 formJson() 方法,才能将 JSON 字符串解析为集合。

    Gson 虽然可以将任意的 Java 对象转成 JSON 字符串,但将字符串解析为指定的集合类型时就需要花点心思了,因为涉及到了泛型——TypeToken 是解决这个问题的银弹。

    3. Jackson

    Jackson 是基于 Stream 构建的一款用来序列化和反序列化 JSON 的 Java 开源库,社区非常活跃,其版本的更新速度也比较快。

    • 截止到目前,GitHub 上已经星标 5.2K 了;
    • Spring MVC 的默认 JSON 解析器;
    • 与 Gson 相比,Jackson 在解析大的 JSON 文件时速度更快。
    • 与 fastjson 相比,Jackson 更稳定。

    在使用 Jackson 之前,需要先添加 Jackson 的依赖。

    <!--Jackson 依赖-->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>    
        <artifactId>jackson-databind</artifactId>    
        <version>2.9.1</version>
    </dependency>  
    

    Jackson 的核心模块由三部分组成。

    • jackson-core,核心包,提供基于"流模式"解析的相关 API,它包括 JsonPaser 和 JsonGenerator。
    • jackson-annotations,注解包,提供标准注解功能。
    • jackson-databind ,数据绑定包, 提供基于"对象绑定" 解析的相关 API ( ObjectMapper ) 和"树模型" 解析的相关 API (JsonNode);基于"对象绑定" 解析的 API 和"树模型"解析的 API 依赖基于"流模式"解析的 API。

    当添加 jackson-databind 之后, jackson-core 和 jackson-annotations 也随之添加到 Java 项目工程中。

    1)准备数据 Person 类

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    @ToString
    static class Person{
        private Integer age;
        private String username;
    }
    

    2)Jackson 简单使用

    private static void method1() throws JsonProcessingException {
        ObjectMapper mapper = new ObjectMapper();
        // 在反序列化时忽略在 Json 中存在但 JavaBean 中不存在的字段
        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        // 在序列化时忽略值为null的字段
        mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
        Person person = new Person(18, "王二");
    
        // 对象转 Json 字符串
        String json = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(person);
        System.out.println(json);
    
        // Json 字符串转对象
        Person person1 = mapper.readValue(json, Person.class);
        System.out.println(person1.toString());
    }
    

    在调用 writeValue() 或者 readValue() 方法之前,往往需要对 JSON 和 JavaBean 之间进行一些定制化配置。

    a)在反序列化时忽略在 JSON 中存在但 JavaBean 不存在的字段

    mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

    b)在序列化时忽略值为 null 的字段

    mapper.setSerializationInclusion(Include.NON_NULL); 

    有些时候,这些定制化的配置对 JSON 和 JavaBean 之间的转化起着重要的作用。如果需要更多配置信息,查看 DeserializationFeature、SerializationFeature 和 Include 类的 Javadoc 即可。

    3. fastjson

    fastjson 是阿里巴巴开源的 JSON 解析库,它可以解析 JSON 格式的字符串,也支持将 Java Bean 序列化为 JSON 字符串。

    fastjson 相对于其他 JSON 库的特点就是快,另外 API 使用起来也非常简单,更是在 2012 年被开源中国评选为最受欢迎的国产开源软件之一。

    PS:尽管 fastjson 值得信赖,但也闹过不少腥风血雨,这里就不提了。

    在使用 fastjson 之前,需要先添加 fastjson 的依赖。

    <!--fastjson 依赖-->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>1.2.75</version>
    </dependency>
    

    1)准备数据 Person 类

    @Data
    @NoArgsConstructor
    @ToString
    static class Person {
        private Integer age;
        private String username;
        private List<String> books = new ArrayList<>();
    
        public Person(Integer age, String username) {
            this.age = age;
            this.username = username;
        }
    
        public void putBook(String bookname) {
            this.books.add(bookname);
        }
    }
    

    2)Fastson 简单使用

    private static void method1() {
        // 对象转 Json 字符串
        Person person = new Person(18,"沉默王二");
        person.putBook("《Web全栈开发进阶之路》");
        person.putBook("《深入了解Java虚拟机》");
        String json = JSON.toJSONString(person);
        System.out.println(json);
    
        // Json 字符串转对象
        Person person1 = JSON.parseObject(json, Person.class);
        System.out.println(person1);
    }
    

    SerializeWriter:相当于StringBuffer

    JSONArray:相当于List<Object>

    JSONObject:相当于Map<String, Object>

    JSON反序列化没有真正数组,本质类型都是List<Object>

    比如说 List<Strudent>     List 转 Json
    
    List<Student> students = new ArrayList();
    String str = JSON.toJSONString(students);     // List 转 json
    
    Json 转 List 方法一
    String json = ""; //获取的 Json 数据
    List<Student> students = JSON.parseObject(json,new TypeReference<List<Student>>(){}); // Json 转 List【需要借助 TypeReference 类进行转化】
    
    Json 转 List 方法二
    List<Student> students = JSON.parseArray(json,Student.class); 
    
    Student 对象要实现 Serializable 接口
    import java.io.Serializable;  
    public class Student implements Serializable{}

    4. 总结

    就我个人而言,我是比较推崇 Gson 的,毕竟是谷歌出品的,品质值得信赖,关键是用起来也确实比较得劲【API 非常实用,而且复杂数据类型的相互转换很靠谱】

    Jackson 呢,在解析大的 JSON 文件时速度更快,也比 fastjson 稳定;

    fastjson 呢,作为我们国产开源软件中的骄傲,嗯,值得尊敬。

  • 相关阅读:
    vue中使用vuepdf插件显示pdf
    vuecirclemenu漂亮的圆形菜单
    console.log输出彩色字,图片等
    项目开发之使用 maven
    用 C 扩展 python
    Flash 与 php 使用 amfphp
    纯命令行的编辑利器:用好 awk 与 sed
    远程调试Java程序
    .net core 项目文件结构浅析
    初识Redis系列之一:简单介绍
  • 原文地址:https://www.cnblogs.com/blogtech/p/14981251.html
Copyright © 2011-2022 走看看