知识分享:JSON数据有哪些解析方式?

本文介绍了四种常见的JSON解析方法:官方解析、谷歌Gson解析、阿里巴巴FastJson解析和Jackson解析,并通过实例展示了对象与JSON之间的相互转换过程。

这个问题是我们作为程序员几乎每天都要进行的操作,那它有多少种方式呢,我们这里就这点来说一说。

解析的四种方式

  • 官方解析
  • 谷歌 Gson 解析
  • 阿里巴巴 FastJson 解析
  • Jackson 解析

案例实操

这里我们就只讨论对象与 json 如何互相转换。

这里我们先创建好 Maven 项目,方便引入依赖,通过单元测试来实际检验我们不同的解析方式。

下面我们都使用 User 对象,先创建好我们需要的类。

User.java

package org.example;

public class User {

    private String name;
    private String sex;
    private Integer age;

    public User() {
    }

    public User(String name, String sex, Integer age) {
        this.name = name;
        this.sex = sex;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", sex='" + sex + '\'' +
                ", age=" + age +
                '}';
    }
    
}

官方解析

官方提供的 json 解析方式,比较繁琐,所以用的人比较少。

第一步,引入依赖:

<!--json官方-->
<dependency>
    <groupId>org.json</groupId>
    <artifactId>json</artifactId>
    <version>20160810</version>
</dependency>

第二步,编写测试代码:

package org.example;

import org.json.JSONObject;
import org.springframework.stereotype.Component;

/**
 * 官方解析
 */
@Component
public class JsonTest1 {

    /**
     * 对象转json
     * @param user
     * @return
     */
    public String userToJson(User user){
        JSONObject jsonObject = new JSONObject(user);
        String jsonStr = jsonObject.toString();
        return jsonStr;
    }

    /**
     * json转对象
     * @param json
     * @return
     */
    public User userFromJson(String json){
        JSONObject jsonObject = new JSONObject(json);
        String name = jsonObject.getString("name");
        String sex = jsonObject.getString("sex");
        int age = jsonObject.getInt("age");
        User user = new User(name,sex,age);
        return user;
    }

}

第三步,单元测试:

package org.example;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:spring.xml")
public class JsonTest1Test {

    @Autowired
    private JsonTest1 jsonTest1;

    @Test
    public void userToJson() {
        User user = new User("秦明", "man", 18);
        String json = jsonTest1.userToJson(user);
        System.out.println(json);
    }

    @Test
    public void userFromJson() {
        String json = "{\"sex\":\"man\",\"name\":\"秦明\",\"age\":18}";
        User user = jsonTest1.userFromJson(json);
        System.out.println(user);
    }
}

第四步,查看结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-s5vC97Cl-1608708668980)(https://imgkr.cn-bj.ufileos.com/76db02f6-dd02-4e23-a6dd-8ce988bc5c62.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1kfKoybi-1608708668985)(https://imgkr.cn-bj.ufileos.com/847c4325-a895-4c13-b3d9-4f12e4876720.png)]

谷歌 Gson 解析

第一步,引入依赖:

<!--gson-->
<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.8.5</version>
</dependency>

第二步,编写测试代码:

package org.example;

import com.google.gson.Gson;
import org.springframework.stereotype.Component;

/**
 * gson解析
 */
@Component
public class JsonTest2 {

    /**
     * 对象转json
     * @param user
     * @return
     */
    public String userToJson(User user){
        Gson gson = new Gson();
        String json = gson.toJson(user);
        return json;
    }

    /**
     * json转对象
     * @param json
     * @return
     */
    public User userFromJson(String json){
        Gson gson = new Gson();
        User user = gson.fromJson(json, User.class);
        return user;
    }

}

第三步,单元测试:同上(下面第三步和第四步和上面都一样,所以下面省略)

第四步,查看结果:同上

阿里巴巴 FastJson 解析

这个解析方式是由阿里巴巴开发出来的,效率最高,深受大家喜爱,功能强大,想要更深入学习的可以查看 FastJson 官网API。

第一步,引入依赖:

<!--fastjson-->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.47</version>
</dependency>

第二步,编写测试代码:

package org.example;

import com.alibaba.fastjson.JSONObject;
import org.springframework.stereotype.Component;

/**
 * fastjson解析
 */
@Component
public class JsonTest3 {

    /**
     * 对象转json
     * @param user
     * @return
     */
    public String userToJson(User user){
        String json = JSONObject.toJSONString(user);
        return json;
    }

    /**
     * json转对象
     * @param json
     * @return
     */
    public User userFromJson(String json){
        User user = JSONObject.parseObject(json,User.class);
        return user;
    }

}

Jackson 解析

这个解析方式是在目前我们使用最流行的一些框架比如 SSM、SpringBoot,其内部的 json 解析使用的就是 Jackson,但往往我们会另外引入 FastJson 来使用,因为速度更快。

第一步,引入依赖:

<!--jackson-->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.9.8</version>
</dependency>

第二步,编写测试代码:

package org.example;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.stereotype.Component;

import java.io.IOException;

/**
 * jackson解析
 */
@Component
public class JsonTest4 {

    /**
     * 对象转json
     * @param user
     * @return
     */
    public String userToJson(User user) throws JsonProcessingException {
        ObjectMapper objectMapper = new ObjectMapper();
        String json = objectMapper.writeValueAsString(user);
        return json;
    }

    /**
     * json转对象
     * @param json
     * @return
     */
    public User userFromJson(String json) throws IOException {
        ObjectMapper objectMapper = new ObjectMapper();
        User user = objectMapper.readValue(json, User.class);
        return user;
    }

}

扩展~JSON的诞生

img

JSON 的诞生是因为 XML 整合到 HTML 中各个浏览器实现的细节不尽相同,所以道格拉斯·克罗克福特(Douglas Crockford)和 奇普·莫宁斯达(Chip Morningstar)一起从 JS 的数据类型中提取了一个子集,作为新的数据交换格式,因为主流的浏览器使用了通用的 JavaScript 引擎组件,所以在解析这种新数据格式时就不存在兼容性问题,于是他们将这种数据格式命名为 “JavaScript Object Notation”,缩写为 JSON,由此 JSON 便诞生了!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值