Json格式解析

泪湿孤枕 提交于 2020-03-09 03:21:09

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的速度优于其他方式
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!