JSON 与 FastJSON

JSON 与 FastJSON

JSON

JavaScript Object Notation(JavaScript 对象表示法)是目前最常用的执行对象序列化的方式。


虽然 json 最初是为了在 JavaScript 语言中使用的,但实际上 json 本身跟语言没有任何关系,各种编程语言都可以使用。
json官方指定了一套标准,各种语言都支持这一套标准,所以 json 也能作为一种跨语言的文本数据(即不支持其它多媒体)交换格式,无障碍的把数据传递到其它语言的程序。

JSON 基本格式:

必须是:对象

{
}

或 数组

[
]

JSON 语法规则:

  • 数据用 名称:值 (也叫键值对)表示

    • 名称(键)必须是字符串

    • 键、值之间用冒号 “:” 分隔。

  • 多条数据之间,用逗号 “,” 分隔

  • 注意符号都是半角,不要因为输入法的原因输入全角了

JSON 值的类型:

  • 数字(整数或浮点数)

  • 字符串(在双引号中)

  • 逻辑值(true 或 false)

  • 数组(在中括号中)

  • 对象(在大括号中)

  • null

值可以是数组、对象,就意味着数据和对象可以任意嵌套、任意深度。

范例:

{
    "name": "韦小宝",
    "age": 26,
    "height": 182.4,
    "birthday": "1670-7-28",
    "isRich": true,
    "wifes": ["阿珂", "双儿", "建宁公主", "苏荃", "沐剑屏", "曾柔", "方怡"],
    "firstMaster": {
      "name": "陈近南",
      "birthday": "1634-12-1"
    }
}

在 Java 程序中如何操作和使用 json 呢?最常见的是使用 FastJSON

FastJSON

FastJSON 是一个Java语言编写的高性能、功能完善、完全支持官方标准的 JSON 库。

使用 FastJson 来操作 json 以及完成对象序列化、反序列化的操作,会非常方便。

对象序列化

下面我们来看一下使用 FastJSON 进行对象序列化的例子。

如果是本地的 IDE 环境,在编码之前,需要引入依赖:

<!-- 在下列地址查询最新的版本:https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.62</version>
</dependency>

注释中的URL,可以查询最新的版本号。一般来说版本号越高,说明越新。但应避免使用带有 alpha beta 标记的版本,表示测试版可能不稳定。

使用 FastJSON 序列化对象


首先必须 import

import com.alibaba.fastjson.JSON;

然后就可以实现啦

public static void main(String<[] args) {
    Building b = new Building();
    b.setName("创业大厦");
    b.setAddress("天宁兰陵兰陵路26号 ");
    String content = JSON.toJSONString(b);
    System.out.println(content);
}

调用 JSON.toJSONString(dog) 方法,把 Building 对象转换为 JSON 格式的字符串返回。

使用 FastJSON 反序列化对象


所谓序列化,就是将对象转换为 JSON 格式字符串的过程,那么顾名思义,反序列化就是将 JSON 格式字符串还原为对象的过程。

序列化使用的是 fastjson 库,那么反序列化同样也使用 fastjson 库。

反序列化代码:

public static void main(String[] args) {
    Building b = new Building();
    b.setName("创业大厦"); 
    b.setAddress("天宁兰陵兰陵路26号"); 
    String content = JSON.toJSONString(b); 
    // 转换为一个具体的对象 
    Building b2 = JSON.parseObject(content, Building.class); 
    String name = b2.getName(); 
    System.out.println(name); 
    // 特殊情况下,java系统里没有具体对象的 class ,可以反序列化为 Map 
    Map bInfo = JSON.parseObject(content, Map.class); 
    String name2 = (String) bInfo.get("name"); 
    System.out.println(name2);
}


反序列化为具体的对象


反序列化时,调用 JSON.parseObject(content, Building.class) 把字符串转换为 Java 对象。

  • 第一个参数是字符串内容

  • 第二个参数是目标类

转换为具体的对象后,就可以使用对象的属性和方法了,例如调用 b2.getName(); 取值。


反序列化为 Map


少数复杂的场景,程序需要把字符串转换为对象,但是系统中又没有依赖具体的目标类。这时可以把字符串转换为 Map 对象。

  • 第二个参数改为 Map 作为目标类即可。

  • 大家都知道,Map 是接口,而接口是不能直接实例化的,必须有个类实现接口才能实例化。那么为什么这里可以写 Map 接口呢,反序列化后的结果到底是什么呢?

    • Java 的特点是“面向接口编程”,这就意味着不必要关心具体是哪种 Map (HashMapTreeMap等)。

    • 这么做的好处是 解耦

  • 少数复杂场景,转换为 Map 从而避免依赖具体的类,也是一种 解耦 的表现。让系统更少的依赖其它系统的代码,可以使系统更易于维护。

反序列化为 List


当 JSON 格式是 {} 时,表示对象,可以反序列化为具体的对象或者 Map

当 JSON 格式是 [] 表示数组,Java 中一般不直接使用数组,而是更方便的 List

List dataList = JSON.parseObject(content, List.class);

那么,List 集合中,包含的到底是什么呢?

反序列化的结果,取决于原始字符串的格式

案例一:

["a1","a2","a3"]

表示集合中包含的是字符串(字符串也是对象)。反序列化的结果是:

List<String> dataList = JSON.parseObject(content, List.class);

案例二:

[{"a1":"1"},{"a2":"2"}]

表示集合中包含的是对象。反序列化的结果是:

List<Map<String, String>> dataList = JSON.parseObject(content, List.class);

案例三:

[["a1","a2","a3"]]

表示集合中包含的是子集合。反序列化的结果是:

List<List<String>> dataList = JSON.parseObject(content, List.class);

总之,源数据格式越复杂,反序列化的结果,嵌套就越多也越复杂。在使用过程中一定要注意弄清楚源数据的格式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/204572.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

网络基础--win10双网卡设置成访问不同的网络

1、背景 我日常中大部分时间都是使用外网的网卡进行办公&#xff0c;只有在连接公司服务器时才需要使用内网。由于我的电脑存在两张网卡&#xff0c;分别用于连接不同的网络&#xff08;常见情况是一张访问公司内网&#xff0c;一张访问公司外网&#xff09;&#xff0c;但是在…

SOT23-3封装的设计与应用:220V转5V芯片电路

SOT23-3封装的设计与应用&#xff1a;220V转5V电路 AH8100介绍了一种基于SOT23-3封装的220V转5V电路l32*4761*OOO1设计方案&#xff0c;该方案具有简单、高效、稳定的特点&#xff0c;适用于各种电子设备。 一、引言 随着科技的发展&#xff0c;电子设备越来越多地应用于我们…

XwFast,我开发了一个基于SpringBoot和MyBatisPlus的敏捷开发框架!

&#x1f680; A Cutting-edge Tool For Rapid Java Web Development. &#x1f449; http://xuewei.world &#x1f448; &#x1f680;简介 XwFast 是专为 Java Web 开发的基于 Spring 系列框架封装的黑科技脚手架&#xff0c;通过诸多实用工具类/组件的使用&#xff0c;旨…

动态:class和:style绑定

1. 在应用界面中, 某个(些)元素的样式是变化的 class/style绑定就是专门用来实现动态样式效果的技术 2. 动态class绑定 :class等号后的变量值 可以是字符串 :class等号后 可以是对象 :class等号后 可以是数组 3. 动态style绑定 :style"{ color: myPinkColor, fontS…

C语言练习记录(蓝桥杯练习)(小蓝数点)

目录 小蓝数点 第一题程序的输出结果是&#xff1f;: 第二题下面代码的执行结果是什么&#xff1f;: 第三题下面代码的执行结果是什么&#xff1f;: 第四题关于关系操作符说法错误的是&#xff1f;: 第五题对于下面代码段&#xff0c;y的值为&#xff1f; 第六题sum 21 …

vue2全局混入正确使用场景和错误场景示例

全局混入在 Vue.js 中的使用场景需要谨慎考虑&#xff0c;因为它会影响所有组件。以下是一些正确和错误的使用场景的例子&#xff1a; 正确的使用场景&#xff1a; 全局工具方法&#xff1a; // 正确的使用场景 Vue.mixin({methods: {$formatDate: function (date) {// 格式化…

navigator.clipboard is undefined in JavaScript issue [Fixed]

navigator.clipboard 在不安全的网站是无法访问的。 在本地开发使用localhost或127.0.0.1没有这个问题。因为它不是不安全网站。 在现实开发中&#xff0c;可能遇到测试环境为不安全网站。 遇到这个问题&#xff0c;就需要将不安全网站标记为非不安全网站即可。 外网提供了3…

智能配电箱监控系统

智能配电箱监控系统是一种用于实时监控配电箱运行状态和电能质量的系统。它通过集成应用物联网技术&#xff0c;实现对配电箱的数据采集、整合和处理&#xff0c;从而让工作人员能够远程了解和掌握配电箱的情况。通过电力设备的数字化&#xff0c;依托电易云-智慧电力物联网&am…

高并发架构——网页爬虫设计:如何下载千亿级网页?

Java全能学习面试指南&#xff1a;https://javaxiaobear.cn 在互联网早期&#xff0c;网络爬虫仅仅应用在搜索引擎中。随着大数据时代的到来&#xff0c;数据存储和计算越来越廉价和高效&#xff0c;越来越多的企业开始利用网络爬虫来获取外部数据。例如&#xff1a;获取政府公…

Echarts大屏-数据可视化

使用原生htmljavascript实现大屏展示,较为麻烦的为边框的四个小角使用伪元素生成,其余echarts使用如下快速上手 - Handbook - Apache ECharts 效果如下:

从薛定谔的猫——量子理论基础

在介绍量子理论基础之前&#xff0c;先介绍一下薛定谔的猫的故事&#xff0c;这个故事可能大多数朋友并不陌生&#xff0c;下面首先回顾一下&#xff1a; 薛定谔的猫是一个在量子力学中用来说明量子叠加态和测量结果的思维实验。这个思维实验最早由物理学家Erwin Schrdinger在1…

SpringSecurity的默认登录页的使用

SpringSecurity的默认登录页的使用 01 前期准备 引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--mysql驱动--><dependency><grou…

算法:Java计算二叉树从根节点到叶子结点的最大路径和

要求从根节点到叶子结点的最大路径和&#xff0c;可以通过递归遍历二叉树来实现。对于二叉树中的每个节点&#xff0c;我们都可以考虑包含该节点的最大路径和。在递归的过程中&#xff0c;我们需要不断更新全局最大路径和。 具体的思路 递归函数设计&#xff1a; 设计一个递归函…

画中画视频剪辑:批量制作画中画,提升视频制作技能

在视频制作过程中&#xff0c;画中画是一种常见的视觉效果&#xff0c;它能够使多个视频片段在同一画面中展示&#xff0c;增加信息的丰富度和视觉的吸引力。这种效果通常用于增加信息的丰富度&#xff0c;如在新闻节目中&#xff0c;同时展示主持人和采访对象的画面。画中画也…

量子芯片:引领计算技术的新篇章

量子芯片:引领计算技术的新篇章 引言 随着量子计算的飞速发展,量子芯片作为量子计算机的核心组件,日益受到人们的关注。量子芯片的出现,不仅有望推动计算技术的革新,更将在信息安全、药物研发、金融投资等领域掀起巨大的变革。在本篇博客中,我们将深入探讨量子芯片的原理…

Java多线程其他细节知识

并发、并行 进程 并发的含义 并行的理解 线程的生命周期

Dubbo 基本信息认识

&#x1f48c; 所属专栏&#xff1a;【微服务】&#x1f600; 作 者&#xff1a;长安不及十里&#x1f4bb; 工作&#xff1a;目前从事电力行业开发&#x1f308; 目标&#xff1a;全栈开发&#x1f680; 个人简介&#xff1a;一个正在努力学技术的Java工程师&#xff0c;专注基…

封装进度条onUploadProgress+axios取消请求的上传组件

目录 定时模拟进度条 方法 A.axios B.xhr 取消请求 完整代码 A.自定义上传组件 B.二次封装组件 情况 增加cancelToken不生效&#xff0c;刷新页面 进度条太快->设置浏览器网速 定时模拟进度条 startUpload() {if (!this.file) return;const totalSize this.fil…

Docker自定义镜像

目录 回顾 镜像含义 DockerFile语法 自定义java项目镜像 创建一个空目录&#xff0c;在这个空目录中创建一个文件&#xff0c;命名为 DockerFile&#xff0c;将 java 项目打包成 jar 包&#xff0c;放到这个目录中 ​编辑 编写DockerFile文件信息 使用 docker build 构建…

#HarmonyOS:软件安装

软件地址 https://developer.harmonyos.com/cn/develop/deveco-studio#download 安装的建议 这个界面这样选&#xff0c;其他界面全部按照默认路径往下走&#xff01;&#xff01;&#xff01; 等待安装… 安装环境错误处理 一般就是本地node配置一场导致&#xff0c;建议…