Java 解析JSON的两种方式 Gson和FastJson

JSON是一个轻量级的数据格式,轻量级是相比较XML等其他复杂的存储格式而言,各个平台语言都支持JSON交互、JSON解析和存储。JSON常用于我们接口交互,前后端交互中,有解析速度快,方便的特点。因此学会JSON解析是非常重要的。

目录

一、JSON简介

简介:

JSON: JavaScript Object Notation ,JS对象简谱,是一种轻量级的数据交换格式。

JSON数据现在是我们开发中用的最多的,百分之九十的数据都是通过JSON方式进行传输,那么想要学好JSON解析就要了解什么是JSON数据,怎么快速解析它从而提升开发效率。

二、JSON数据格式

什么是JSON数据?

{
    "code": "10000",
    "charge": false,
    "msg": "查询成功",
    "result": {
        "showapi_res_code": 0,
        "showapi_res_error": "",
        "showapi_res_body": {
            "allNum": 7892,
            "allPages": 395,
            "contentlist": [
                {
                    "ct": "2016-05-30 16:30:27.242",
                    "id": "574bfa236e36c1d5f9289678",
                    "img": "http://www.zbjuran.com/uploads/allimg/160530/2-160530145631924.gif",
                    "title": "要不要来个鸳鸯戏水呢",
                    "type": 3
                },
                {
                    "ct": "2016-05-30 16:30:27.239",
                    "id": "574bfa236e36c1d5f9289677",
                    "img": "http://www.zbjuran.com/uploads/allimg/160530/2-160530151R09B.gif",
                    "title": "翻滚的美少女",
                    "type": 3
                }
            ],
            "currentPage": 1,
            "maxResult": 20,
            "ret_code": 0
        }
    }
}

JSON数据就是一段字符串而已,只不过有不同意义的分隔符将其分割开来。

格式:

  1. {} 一个大括号,表示一个对象。括号中描述对象的属性。通过键值对来描述对象的属性。
  2. [] 一个中括号,表示数组。数组中可以存放对象,也可以存放值。
  3. : 冒号,键与值使用冒号连接。
  4. , 逗号,多个键值对使用逗号分隔。
  5. "" 引号,键值对的,应使用引号引起(通常Java解析时,键不使用引号会报错。而JS能正确解析)。
  6. 键值对的,可以是对象、数组、字符串(字符串用""引号引住)或数字(数字不需要用引号)。

三、Java与JSON

在Java中需要做什么?

  • 将 Java 中的对象,快速的转换为 JSON 格式的字符串。

  • 将 JSON 格式的字符串,转换为 Java 对象。

四、使用Gson解析JSON数据

Gson是谷歌官方推出的支持 JSON -- Java Object 相互转换的 Java序列化/反序列化 库。在使用之前需要在项目中导入Gson的jar包。我使用的是 gson-2.8.6.jar。下载地址

点击这里即可下载

Java 解析JSON的两种方式 Gson和FastJson

1. 对象转换为JSON字符串

先创建一个 Book类,类中有idnameinfo属性。

public class Book {
    private String id;
    private String name;
    private String info;

    public Book() {
    }

    public Book(String id, String name, String info) {
        this.id = id;
        this.name = name;
        this.info = info;
    }

    @Override
    public String toString() {
        return "Book{" +
                "id='" + id + '\'' +
                ", name='" + name + '\'' +
                ", info='" + info + '\'' +
                '}';
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        com.java.json.Book book = (com.java.json.Book) o;
        return Objects.equals(id, book.id) && Objects.equals(name, book.name) && Objects.equals(info, book.info);
    }

    @Override
    public int hashCode() {
        return Objects.hash(id, name, info);
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

    public String getInfo() {
        return info;
    }

    public void setInfo(String info) {
        this.info = info;
    }
}

下面开始使用,我们先来将对象转换为JSON字符串。

import com.google.gson.Gson;

/**
 * @Author: 网友小锋
 * @Description: 使用 Gson 解析 json(谷歌)
 * @Date Created in 2021-01-15 17:45
 * @Modified By:
 */
public class DemoGson1 {
    public static void main(String[] args) {
        // 1.   创建Gson对象
        Gson gson = new Gson();
        // 2.   创建一个对象
        Book b = new Book("1001", "金桃子", "种植桃子真辛苦");
        // 对象转换为 json 字符串
        String json = gson.toJson(b);
        System.out.println(json);
    }
}

运行结果:

Java 解析JSON的两种方式 Gson和FastJson
先创建Gson对象Gson gson = new Gson();,使用String json = gson.toJson(对象);对象已被正确的转换为json字符串了,非常简单。

2. JSON字符串转换为对象

这个操作也非常简单。

import com.google.gson.Gson;

/**
 * @Author: 网友小锋
 * @Description: 使用 Gson 解析 json(谷歌)
 * @Date Created in 2021-01-15 17:45
 * @Modified By:
 */
public class DemoGson2 {
    public static void main(String[] args) {
        // 1.   创建Gson对象
        Gson gson = new Gson();
        // json 字符串转换为对象 {"id":"1001","name":"金桃子","info":"种植桃子真辛苦"}
        Book book = gson.fromJson("{\"id\":\"1001\",\"name\":\"金桃子\",\"info\":\"种植桃子真辛苦\"}", Book.class);
        System.out.println(book.getId());
        System.out.println(book.getName());
    }
}

使用Object obj = gson.fromJson("json字符串", Object.class);json字符串转换为对象,同样也是没有任何的问题,可以拿到。

Java 解析JSON的两种方式 Gson和FastJson

3. JSON字符串转换为HashMap

我们来解析一下稍微复杂一点的json字符串,在一个属性中加入数组。

{"id":"1001","name":"金桃子","info":"种植桃子真辛苦","page":["锄禾日当午","汗滴禾下土","床前明月光"]}

下面看解析代码

import com.google.gson.Gson;

import java.util.HashMap;
import java.util.List;

/**
 * @Author: 网友小锋
 * @Description: 使用 Gson 解析 json(谷歌)
 * @Date Created in 2021-01-15 17:45
 * @Modified By:
 */
public class DemoGson3 {
    public static void main(String[] args) {
        // 1.   创建Gson对象
        Gson g = new Gson();
        // 2.   json 字符串转换为 HashMap {"id":"1001","name":"金桃子","info":"种植桃子真辛苦","page":["锄禾日当午","汗滴禾下土","床前明月光"]}
        HashMap data = g.fromJson("{\"id\":\"100\",\"name\":\"金苹果\",\"info\":\"种植苹果的真辛苦\",\"page\":[\"锄禾日当午\",\"汗滴禾下土\",\"床前明月光\"]}", HashMap.class);
        // name键值对是字符串
        System.out.println(data.get("name").getClass());
        // page键值对是 ArrayList集合
        System.out.println(data.get("page").getClass());
        // 获取name属性的值
        String name = (String) data.get("name");
        System.out.println(name);
        // 获取page属性的值
        List page= (List) data.get("page");
        System.out.println(page.get(1));
        System.out.println(page.get(2));
    }
}

在转换为HashMap后,idnameinfo属性解析变成了String字符串,而page属性是一个数组,解析后变成了ArrayList集合。

Java 解析JSON的两种方式 Gson和FastJson

五、使用FastJson解析JSON数据

FastJson是由阿里巴巴工程师基于Java开发的一款JSON解析器和生成器,可用于将Java对象
转换为其JSON表示形式。它还可以用于将JSON字符串转换为等效的Java对象。Fastjson可以
处理任意Java对象,包括没有源代码的预先存在的对象。

使用前需要在项目中导入FastJson的jar包,我使用的是的 fastjson-1.2.75.jar。下载地址。如果此链接失效,请去GitHub官网下载。

Java 解析JSON的两种方式 Gson和FastJson

使用FastJson解析json比Gson更为简单。下面直接来看代码:

import com.alibaba.fastjson.JSON;

import java.util.HashMap;
import java.util.List;

/**
 * @Author: 网友小锋
 * @Description: 使用 FastJson 解析 json (阿里)
 * @Date Created in 2021-01-15 18:07
 * @Modified By:
 */
public class DemoFastJson {
    public static void main(String[] args) {
        Book book = new Book("1002","唐诗三百首","凝视地上霜");
        // 1.   对象 转换为 json字符串
        String json = JSON.toJSONString(book);
        System.out.println(json);

        // 2.   json字符串 转换为 对象
        Book b = JSON.parseObject(json, Book.class);
        System.out.println(b.getName());

        // json 字符串转换 list ["一二三","二三四","三四五"]
        List<String> list = JSON.parseArray("[\"一二三\",\"二三四\",\"三四五\"]", String.class);
        System.out.println(list.get(2));

        // json 字符串转换为 HashMap {"id":"1001","name":"金桃子","info":"种植桃子真辛苦","page":["锄禾日当午","汗滴禾下土","床前明月光"]}
        HashMap data = JSON.parseObject("{\"id\":\"1001\",\"name\":\"金桃子\",\"info\":\"种植桃子真辛苦\",\"page\":[\"锄禾日当午\",\"汗滴禾下土\",\"床前明月光\"]}", HashMap.class);
        List page= (List) data.get("page");
        System.out.println(page.get(0));
    }
}

使用FastJson解析,不需要创建相应的对象,直接使用静态方法JSON.toJSONString(对象);转换为 json字符串,JSON.parseObject(json字符串, 对象.class);转换为对象。

Java 解析JSON的两种方式 Gson和FastJson

六、总结

使用Gson解析

  1. 使用Gson解析,先导入jar包gson-2.8.6.jar
  2. 创建Gson对象,Gson gson = new Gson();
  3. 对象转换为 json 字符串,String json = gson.toJson(对象);
  4. json 字符串转换为对象,Object obj = gson.fromJson("json字符串", Object.class);

使用FastJson解析

  1. 使用FastJson解析,先导入jar包fastjson-1.2.75.jar
  2. 对象转换为 json字符串,String json = JSON.toJSONString(对象);
  3. json 字符串转换为对象,Object obj = JSON.parseObject("json字符串", Object.class);
  4. json 字符串转换 listList<Object> list = JSON.parseArray("json字符串", Object.class);

如果在团队中需要你去选型,为了更好的融入团队,在国内建议使用FastJson,如果FastJson有安全隐患,则使用Gson。

上一篇:Java 使用fastjson 将 json字符串写到文件中去


下一篇:通过json重置java对象