【Spring Boot】——集成JSON工具

2023-10-26

前言:json是现在非常流程的数据交换格式,所以对于被开发人员来说如何更好了解java对象和json格式之间的转换是至关重要的,接下来我们来好好说一说。

一、什么是JSON(摘自百度百科

JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。

传统的我们使用比较多的是XML格式,那么两者之间的区别又是什么呢?

可读性

JSON和XML的可读性可谓不相上下,一边是简易的语法,一边是规范的标签形式,很难分出胜负。

可扩展性

XML天生有很好的扩展性,JSON当然也有,没有什么是XML可以扩展而JSON却不能扩展的。不过JSON在Javascript主场作战,可以存储Javascript复合对象,有着xml不可比拟的优势。

编码难度

XML有丰富的编码工具,比如Dom4j、Dom、SAX等,JSON也有提供的工具。无工具的情况下,相信熟练的开发人员一样能很快的写出想要的xml文档和JSON字符串,不过,xml文档要多很多结构上的字符。

解码难度

XML的解析方式有两种:

一是通过文档模型解析,也就是通过父标签索引出一组标记。例如:xmlData.getElementsByTagName("tagName"),但是这样是要在预先知道文档结构的情况下使用,无法进行通用的封装。

另外一种方法是遍历节点(document 以及 childNodes)。这个可以通过递归来实现,不过解析出来的数据仍旧是形式各异,往往也不能满足预先的要求。

凡是这样可扩展的结构数据解析起来一定都很困难。

JSON也同样如此。如果预先知道JSON结构的情况下,使用JSON进行数据传递简直是太美妙了,可以写出很实用美观可读性强的代码。如果你是纯粹的前台开发人员,一定会非常喜欢JSON。但是如果你是一个应用开发人员,就不是那么喜欢了,毕竟xml才是真正的结构化标记语言,用于进行数据传递。

而如果不知道JSON的结构而去解析JSON的话,那简直是噩梦。费时费力不说,代码也会变得冗余拖沓,得到的结果也不尽人意。但是这样也不影响众多前台开发人员选择JSON。因为json.js中的toJSONString()就可以看到JSON的字符串结构。当然对于不是经常使用这个字符串的人,这样做仍旧是噩梦。常用JSON的人看到这个字符串之后,就对JSON的结构很明了了,就更容易的操作JSON。

以上是在Javascript中仅对于数据传递的xml与JSON的解析。在Javascript地盘内,JSON毕竟是主场作战,其优势当然要远远优越于xml。如果JSON中存储Javascript复合对象,而且不知道其结构的话,我相信很多程序员也一样是哭着解析JSON的。

除了上述之外,JSON和XML还有另外一个很大的区别在于有效数据率。JSON作为数据包格式传输的时候具有更高的效率,这是因为JSON不像XML那样需要有严格的闭合标签,这就让有效数据量与总数据包比大大提升,从而减少同等数据流量的情况下,网络的传输压力 [2] 

实例比较

XML和JSON都使用结构化方法来标记数据,下面来做一个简单的比较。

用XML表示中国部分省市数据如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

<?xml version="1.0" encoding="utf-8"?>

<country>

    <name>中国</name>

    <province>

        <name>黑龙江</name>

        <cities>

            <city>哈尔滨</city>

            <city>大庆</city>

        </cities>

    </province>

    <province>

        <name>广东</name>

        <cities>

            <city>广州</city>

            <city>深圳</city>

            <city>珠海</city>

        </cities>

    </province>

    <province>

        <name>台湾</name>

        <cities>

            <city>台北</city>

            <city>高雄</city>

        </cities>

    </province>

    <province>

        <name>新疆</name>

        <cities>

            <city>乌鲁木齐</city>

        </cities>

    </province>

</country>

用JSON表示如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

{

    "name": "中国",

    "province": [{

        "name": "黑龙江",

        "cities": {

            "city": ["哈尔滨", "大庆"]

        }

    }, {

        "name": "广东",

        "cities": {

            "city": ["广州", "深圳", "珠海"]

        }

    }, {

        "name": "台湾",

        "cities": {

            "city": ["台北", "高雄"]

        }

    }, {

        "name": "新疆",

        "cities": {

            "city": ["乌鲁木齐"]

        }

    }]

}

可以看到,JSON 简单的语法格式和清晰的层次结构明显要比 XML 容易阅读,并且在数据交换方面,由于 JSON 所使用的字符要比 XML 少得多,可以大大得节约传输数据所占用的带宽。

二、java中常用的JSON工具包

1.json-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在功能和性能上面都不能满足现在互联网化的需求。

2.开源的Jackson

相比json-lib框架,Jackson所依赖的jar包较少,简单易用并且性能也要相对高些。
而且Jackson社区相对比较活跃,更新速度也比较快。
Jackson对于复杂类型的json转换bean会出现问题,一些集合Map,List的转换出现问题。
Jackson对于复杂类型的bean转换Json,转换的json格式不是标准的Json格式

3.Google的Gson

Gson是目前功能最全的Json解析神器,Gson当初是为因应Google公司内部需求而由Google自行研发而来,
但自从在2008年五月公开发布第一版后已被许多公司或用户应用。
Gson的应用主要为toJson与fromJson两个转换函数,无依赖,不需要例外额外的jar,能够直接跑在JDK上。
而在使用这种对象转换之前需先创建好对象的类型以及其成员才能成功的将JSON字符串成功转换成相对应的对象。
类里面只要有get和set方法,Gson完全可以将复杂类型的json到bean或bean到json的转换,是JSON解析的神器。
Gson在功能上面无可挑剔,但是性能上面比FastJson有所差距。

4.阿里巴巴的FastJson

Fastjson是一个Java语言编写的高性能的JSON处理器,由阿里巴巴公司开发。
无依赖,不需要例外额外的jar,能够直接跑在JDK上。
FastJson在复杂类型的Bean转换Json上会出现一些问题,可能会出现引用的类型,导致Json转换出错,需要制定引用。
FastJson采用独创的算法,将parse的速度提升到极致,超过所有json库。

综上4种Json技术的比较,在项目选型的时候可以使用Google的Gson和阿里巴巴的FastJson两种并行使用,
如果只是功能要求,没有性能要求,可以使用google的Gson,如果有性能上面的要求可以使用Gson将bean转换json确保数据的正确,使用FastJson将Json转换Bean。

接下来就来看看具体的代码吧.............

三、代码实战

1、导入Maven依赖

        <!--google的gson 注重解析数据的正确性-->
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.8.0</version>
        </dependency>
        <!--alibaba的fastjson 注重数据转化的效率-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.1.22</version>
        </dependency>

2、创建java对象(注意添加Lombok组件

@Data
@AllArgsConstructor
@NoArgsConstructor
public class MyObject {
    private String name;
    private Integer age;
    private String address;
    private Date createTime;
}

3.Gson使用说明

package com.example.demo.huyue.Json;

import com.alibaba.fastjson.JSONObject;
import com.google.gson.*;
import com.google.gson.reflect.TypeToken;

import java.util.Date;
import java.util.List;
import java.util.Set;

/**
 * @author 
 */
public class GsonDemo {
    public static void main(String[] args) {
        Gson gson = new Gson();
        //1.bean转json
        MyObject object = new MyObject();
        object.setName("山山来驰");
        object.setAge(19);
        object.setAddress("中国上海");
        System.out.println("bean转json=====>" + gson.toJson(object));

        //2.json转bean
        String jsonString = "{\"name\":\"山山来驰\",\"age\":19,\"address\":\"中国上海\"}";
        System.out.println("json转bean=====>" + gson.fromJson(jsonString, MyObject.class));

        //3.json转换复杂的bean,比如List,Set
        jsonString = "[{\"name\":\"山山来驰\",\"age\":19,\"address\":\"中国上海\"},{\"name\":\"土地孙\",\"age\":100,\"address\":\"美国硅谷\"}]";
        System.out.println("json转换复杂的bean List=====>" + gson.fromJson(jsonString, new TypeToken<List<MyObject>>() {
        }.getType()).toString());
        System.out.println("json转换复杂的bean Set=====>" + gson.fromJson(jsonString, new TypeToken<Set<MyObject>>() {
        }.getType()).toString());

        //4.通过json对象直接操作json以及一些json的工具
        //4.1格式化Json
        gson = new GsonBuilder().setPrettyPrinting().create();
        JsonParser parser = new JsonParser();
        JsonElement element = parser.parse(jsonString);
        System.out.println("格式化Json=====>" + gson.toJson(element));

        //4.2判断字符串是否是json,通过捕捉的异常来判断是否是json
        try {
            new JsonParser().parse(jsonString).getAsJsonObject();
            System.out.println("判断是否是json=====>" + true);
        } catch (Exception e) {
            System.out.println("判断是否是json=====>" + false);
        }

        //4.3从json串中获取属性
        jsonString = "{\"name\":\"山山来驰\",\"age\":19,\"address\":\"中国上海\"}";
        try {
            System.out.println("从json串中获取属性=====>" + new JsonParser().parse(jsonString).getAsJsonObject().get("name").toString());
        } catch (Exception e) {
            System.out.println("从json串中获取属性=====>" + null);
        }

        //4.4去除json中的某个属性
        System.out.println("去除json中的某个属性=====>" + new JsonParser().parse(jsonString).getAsJsonObject().remove("name").toString());

        //4.5向json中添加属性
        new JsonParser().parse(jsonString).getAsJsonObject().addProperty("phone", new Gson().toJson("18355191886"));
        System.out.println("向json中添加属性=====>" + jsonString);

        //4.6修改json中的属性
        JsonObject jsonObject = new JsonParser().parse(jsonString).getAsJsonObject();
        jsonObject.remove("address");
        jsonObject.addProperty("address", new Gson().toJson("中国北京"));
        System.out.println("修改json中的属性=====>" + jsonString);

        //4.7判断json中是否有属性
        System.out.println("判断json中是否有属性=====>" + new JsonParser().parse(jsonString).getAsJsonObject().has("address"));

        //4.8json中日期格式的处理
        gson = new GsonBuilder().setDateFormat("yyyyMMddHHmmssSSS").create();
        MyObject myObject = new MyObject();
        myObject.setName("二郎神");
        myObject.setAge(101);
        myObject.setAddress("南天门");
        myObject.setCreateTime(new Date());
        System.out.println("json中日期格式的处理=====>" + gson.toJson(myObject));

    }
}

4、FastJson使用说明

package com.example.demo.huyue.Json;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
import sun.nio.cs.ext.JIS_X_0212_Solaris;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Set;

/**
 * @author
 */
public class FastGsonDemo {
    public static void main(String[] args) {
        //1.bean转换json
        //1.1将对象转换成格式化的json
        MyObject myObject = new MyObject();
        myObject.setName("李寻欢");
        myObject.setAge(31);
        myObject.setAddress("天上人间");
        myObject.setCreateTime(new Date());
        System.out.println("将对象转换成格式化的json=====>" + JSON.toJSONString(myObject, true));

        //1.2将对象转换成非格式化的json
        System.out.println("将对象转换成非格式化的json=====>" + JSON.toJSONString(myObject, false));

        //1.3数组转json
        List<MyObject> list = new ArrayList<>(16);
        MyObject myObject1 = new MyObject("东邪", 56, "桃花岛", new Date());
        MyObject myObject2 = new MyObject("西毒", 55, "西方极乐世界", new Date());
        MyObject myObject3 = new MyObject("南帝", 60, "皇宫大院", new Date());
        MyObject myObject4 = new MyObject("北丐", 70, "丐帮", new Date());
        list.add(myObject1);
        list.add(myObject2);
        list.add(myObject3);
        list.add(myObject4);
        System.out.println("数组转json=====>" + JSON.toJSONString(list));

        //2.json转bean
        String jsonString = "{\"address\":\"天上人间\",\"age\":31,\"createTime\":1556693449741,\"name\":\"李寻欢\"}";
        System.out.println("json转bean=====>" + JSON.parseObject(jsonString, MyObject.class));

        //3.json转复杂bean
        jsonString = "[{\"address\":\"桃花岛\",\"age\":56,\"createTime\":1556693450022,\"name\":\"东邪\"},{\"address\":\"西方极乐世界\",\"age\":55,\"createTime\":1556693450022,\"name\":\"西毒\"},{\"address\":\"皇宫大院\",\"age\":60,\"createTime\":1556693450022,\"name\":\"南帝\"},{\"address\":\"丐帮\",\"age\":70,\"createTime\":1556693450022,\"name\":\"北丐\"}]";
        System.out.println("json转复杂bean======>" + JSON.parseObject(jsonString, new TypeReference<List<MyObject>>() {
        }));

        //4.通过json对象直接操作json
        //4.1从json串中获取属性
        jsonString = "{\"address\":\"天上人间\",\"age\":31,\"createTime\":1556693449741,\"name\":\"李寻欢\"}";
        System.out.println("从json串中获取属性=====>" + JSON.parseObject(jsonString).get("name"));

        //4.2除去json中的某个属性
        JSONObject jsonObject = JSON.parseObject(jsonString);
        jsonObject.keySet().remove("name");
        System.out.println("除去json中的某个属性=====>" + jsonObject.toString());

        //4.3向json中添加属性
        jsonObject.put("name", JSON.toJSONString("江南七怪"));
        System.out.println("向json中添加属性=====>" + jsonObject.toString());

        //4.4修改json中的属性
        if (jsonObject.keySet().contains("address")) {
            jsonObject.put("address", JSON.toJSONString("地下人间"));
        }
        System.out.println("修改json中的属性=====>" + jsonObject.toString());

        //4.5判断json中是否有属性
        System.out.println("判断json中是否有属性======>" + jsonObject.keySet().contains("createTime"));

        //4.6json中日期格式的处理
        MyObject object = new MyObject("孙悟空", 22, "花果山", new Date());
        System.out.println("json中日期格式的处理=====>" + JSON.toJSONStringWithDateFormat(object, "yyyyMMddHHmmssSSS"));


    }
}

四、总结

目前使用的基本都是基于Gson和FastJson,以后可能会有更好用的组件,一定要坚持学习,这样才不会被淘汰。

参考地址:https://blog.csdn.net/jason201710/article/details/78657469

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Spring Boot】——集成JSON工具 的相关文章

随机推荐

  • 常见三方结算周期都是有哪些?

    T1 为工作日次日 就是一个工作日结算 如遇到节假日 则延迟到节假日结束后第一个工作日结算 T0 为工作日当天结算 当然如遇节假日 节假日中的交易不结算 延迟到节假日结束后的第一个工作日统一结算 D1 为交易后自然日次日结算 包含节假日内
  • Streamlit 讲解专栏(三):两种方案构建多页面

    文章目录 1 前言 2 第一种方案 使用Session State实现多页面交互 2 1 Session State简介 2 2 多页面应用的基本结构 2 3 实现多页面交互的代码示例 2 4 Session State机制的优缺点 3 第
  • 如何实现 Array 和 List 之间的转换?

    在 Java 中 我们可以通过以下方法实现 Array 和 List 之间的转换 数组转 List String arr apple banana orange List
  • 2023最新宝塔面板8.0.1企业版开心版

    宝塔面板是目前一个非常好用的可视化面板 这几天我自己搭建了一个宝塔云端 不经过宝塔官方接口 无需绑定手机号 安装之后直接显示企业版 所有插件全部免费使用 付费的也能使用 脚本如下 centos安装脚本 yum install y wget
  • 【蓝牙开发】Andorid蓝牙绝对音量

    蓝牙绝对音量相关基础知识 1 什么是绝对音量 Android 蓝牙部分的官方文档有如下描述 Androud Bluetooth Service 在 Android 6 0 及更高版本中 Android 蓝牙堆栈允许音频源设置绝对音量 以便用
  • 【毕业设计】深度学习行人重识别算法研究与实现 - python opencv yolo Reid

    文章目录 0 前言 1 课题背景 2 效果展示 3 行人检测 4 行人重识别 5 其他工具 6 最后 0 前言 Hi 大家好 这里是丹成学长的毕设系列文章 对毕设有任何疑问都可以问学长哦 这两年开始 各个学校对毕设的要求越来越高 难度也越来
  • WIN10的传递优化文件是个什么鬼?能删除吗?

    Win10正式版系统使用时间长了以后 电脑磁盘总会产生一些冗余的文件和磁盘碎片 我们可以用一些工具软件对硬盘进行优化和处理 其实利用系统自带的工具也可以清理磁盘的 但在操作过程中 我们常常会看到一个名叫 传递优化文件 的选项 而且多数情况下
  • UA到底是什么

    欢迎关注勤于奋 每天12点准时更新国外LEAD相关技术 今天这篇文章也是比较基础的文章 其实有很多新手还是搞不懂 所以我特意来写篇文章聊聊这个UA 到底是什么 在我们国外LEAD当中起到的作用 如果搞不懂 很多东西你都没有办法灵活运用 首先
  • 19款资源整合类网站推荐:每一个网站都堪称以一敌百

    强烈推荐这19个资源聚合网站 每一个网站都足以堪称 以一敌百 因为每一个网站都聚合了相当多不同类型 不同领域的网站资源 并且做了分类导航方便大家查找使用 所以 与其收藏那么多零碎的网址 不如收藏下面这些网站资源 比格张 发现更好的资源 一个
  • java8的日期工具类(获取当前时间 相隔天数 小时 分钟 秒等处理)

    package com example list test import java text ParseException import java text SimpleDateFormat import java time import
  • tvm 入门(二)

    代码是一个tvm入门的例子 以向量相加为例 使用tvm的流程是 1 描述串行的向量相加是怎么做的 2 描述并行的时候 怎么对计算单元做划分 3 编译目标函数 本文所示代码可以看到用tvm生成的cuda代码 4 把编译生成的内容保存成文件 加
  • VMware Workstation 未能启动 VMware Authorization Service。您可以尝试手动启动 VMware Authorization Service。如果此问题仍然存

    报错界面 解决方法一 管理员身份运行即可 解决方法二 打开服务 找到VMware Authorization Service右键选择然后点启动 然后发现又报了下面的错误 不慌这时候打开属性把启动类型改成手动即可
  • String、StringBuffer和StringBuilder的异同点

    String StringBuffer StringBuilder三者的异同 String 不可变的字符序列 底层使用char 存储 StringBuffer 可变的字符序列 线程安全的 效率低 底层使用char 存储 StringBuil
  • OpenAI的人工智能语音识别模型Whisper详解及使用

    1 whisper介绍 拥有ChatGPT语言模型的OpenAI公司 开源了 Whisper 自动语音识别系统 OpenAI 强调 Whisper 的语音识别能力已达到人类水准 Whisper是一个通用的语音识别模型 它使用了大量的多语言和
  • 安装mingw出现download failed和unable to continue

    利用mingw get setup安装mingw总是出现download failed和unable to continue错误 截图如下 错误原因 因为服务器在外网 可能是对方服务器不稳定 连接出错等问题导致 解决办法 下载对应等离线安装
  • 11信号学习之sigaction函数及使用其实现信号捕捉案例(信号最重要的一节)

    概述 注意 在我关于信号的文章中 我所说的系统的mask的意思实际上是进程的mask 每个进程的mask都是唯一的 所以我就将其称为系统的 但不能理解为每个进程的mask都是共用的 1 sigaction函数 1 上一篇我们说的signal
  • 基于STM32的DMX512开发

    首先基本了解一下DMX512的基本协议 一 DMX512协议 DMX 是Digital MultipleX 的缩写 意为多路数字传输 DMX512控制协议是美国舞台灯光协会 usITT 于1990年发布的灯光控制器与灯具设备进行数据传输的工
  • 复习使用git(二)

    删除远程分支 git push origin delete 分支名 撤销修改 撤销工作区的修改 已修改 但尚未添加 add 使用 git restore 文件名 撤销工作区的修改 Note git checkout 文件名 checkout
  • 基于STM32F407的SDCard读写操作及USB挂载(HAL库)

    基于STM32F407的SDCard读写操作及USB挂载 HAL库 本来在上一篇SD卡读写也都OK了 后来想着挂载SD卡做U盘 就去查了下资料 结果基本全是HAL库的 原来没用过HAL库 于是本着好奇的心态去下了 说实话 确实看起来简单多了
  • 【Spring Boot】——集成JSON工具

    前言 json是现在非常流程的数据交换格式 所以对于被开发人员来说如何更好了解java对象和json格式之间的转换是至关重要的 接下来我们来好好说一说 一 什么是JSON 摘自百度百科 JSON JavaScript Object Nota