ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2021-01-16 17:59:37  阅读:242  来源: 互联网

标签:FastJson Java name json JSON 字符串 Gson String


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。下载地址

点击这里即可下载

在这里插入图片描述

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);
    }
}

运行结果:

在这里插入图片描述
先创建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字符串转换为对象,同样也是没有任何的问题,可以拿到。

在这里插入图片描述

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集合。

在这里插入图片描述

五、使用FastJson解析JSON数据

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

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

在这里插入图片描述

使用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);转换为对象。

在这里插入图片描述

六、总结

使用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。

标签:FastJson,Java,name,json,JSON,字符串,Gson,String
来源: https://blog.csdn.net/xxq010516/article/details/112707411

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有