JSON 与 FastJSON

news2024/11/16 3:34:25

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

广州华锐视点:3D毒品预防专题教育平台帮助青少年提升拒毒意识

随着科技的不断发展&#xff0c;人们的生活方式也在不断地改变。在这个信息爆炸的时代&#xff0c;传统的普法教育方式已经无法满足人们的需求。为了适应这一变化&#xff0c;越来越多的教育机构开始尝试利用现代科技手段进行普法教育。其中&#xff0c;3D毒品预防专题教育平台…

C++基础 -21-多继承与多级继承

多继承 代码示例 #include "iostream"using namespace std;class base1 { public:base1() {}base1(int a, int b) : a(a), b(b) {}int a;protected:int b; };class base2 { public:base2() {}base2(int a, int b) : c(a), d(b) {}int c;protected:int d; };class …

开启虾皮购物新旅程,快速注册买家号

想要在shopee上畅享丰富的购物体验吗&#xff1f;那就让我们一起迈出第一步&#xff0c;注册一个属于你自己的虾皮买家号吧&#xff01; 1. 访问虾皮平台 首先&#xff0c;打开你的浏览器&#xff0c;输入虾皮平台网址&#xff0c;点击注册或登录按钮。这将引导你进入注册界面…

Python语言学习笔记之七(JOSN应用)

本课程对于有其它语言基础的开发人员可以参考和学习&#xff0c;同时也是记录下来&#xff0c;为个人学习使用&#xff0c;文档中有此不当之处&#xff0c;请谅解。 1、认识Json JSON (JavaScript Obiect Notation)是一种轻量级的数据交换格式&#xff0c;它是ECMAScript的一…

计算机毕业设计 基于Web的课程设计选题管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

Python中基于Pandas的Excel工具类,一文掌握!

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 在Python中处理Excel时&#xff0c;Pandas库是一个强大且灵活的工具。它不仅能够轻松处理数据分析任务&#xff0c;还能用于创建、读取和写入Excel文件。在本文中&#xff0c;将探讨如何使用Pandas库封装一个Exc…

C#图像处理OpenCV开发指南(CVStar,04)——图片像素访问与多种局部放大效果的实现代码

​​​​​​​ 使用本文代码需要预先设置一点开发环境&#xff0c;请阅读另外一篇博文&#xff1a; C#图像处理OpenCV开发指南&#xff08;CVStar&#xff0c;03&#xff09;——基于.NET 6的图像处理桌面程序开发实践第一步https://blog.csdn.net/beijinghorn/article/deta…

UWB高精度定位系统项目源码

在现代社会中&#xff0c;精准定位技术对于各行各业都至关重要。为了满足对高精度定位的需求&#xff0c;超宽带&#xff08;Ultra-Wideband, UWB&#xff09;技术应运而生。UWB高精度定位系统以其出色的定位精度和多样化的应用领域而备受关注。本文将深入探讨UWB高精度定位系统…

ntopng如何将漏洞扫描与流量监控相结合,以提高网络安全性

来源&#xff1a;艾特保IT 虹科干货 | ntopng如何将漏洞扫描与流量监控相结合&#xff0c;以提高网络安全性 欢迎关注虹科&#xff0c;为您提供最新资讯&#xff01; ntopng为人所知的“身份”是被动流量监控。然而&#xff0c;如今的ntopng6.0也进化出主动监控功能来&#xf…

springboot自定义校验注解的实现

自定义校验注解的实现 通过谷粒商城项目学习了自定义校验器的实现一、编写自定义校验注解二、自定义注解的校验器三、关联自定义的校验器和自定义的校验注解总结 通过谷粒商城项目学习了自定义校验器的实现 近日在学习雷神的谷粒商城项目&#xff0c;其中有一个自定义校验的实…

力扣日记11.30-【二叉树篇】平衡二叉树

力扣日记&#xff1a;【二叉树篇】平衡二叉树 日期&#xff1a;2023.11.30 参考&#xff1a;代码随想录、力扣 110. 平衡二叉树 题目描述 难度&#xff1a;简单 给定一个二叉树&#xff0c;判断它是否是高度平衡的二叉树。 本题中&#xff0c;一棵高度平衡二叉树定义为&#…

【LeetCode】每日一题 2023_11_29 无限集中的最小数字(哈希/堆)

文章目录 刷题前唠嗑题目&#xff1a;无限集中的最小数字题目描述代码与解题思路偷看大佬题解 结语 刷题前唠嗑 LeetCode&#xff1f;启动&#xff01;&#xff01;&#xff01; 今天的题目也比较的简单&#xff0c;因为数据量不大&#xff0c;所以什么做法都能过的去 题目&a…

java 对象大小计算

说明&#xff1a; 对于64位机&#xff1a;一个对象由三部分组成 对象头(object header) mark word &#xff1a;64bitkclass pointer &#xff1a;32bit(默认使用指针压缩)&#xff0c;如果取消指针压缩( XX:-UseCompressedOops)&#xff0c;则占用64bit数组长度&#xff1a;数…

Linux:docker镜像的创建(5)

1.基于已有镜像创建 步骤&#xff1a; 1.将原始镜像加入容器并运行 2.在原始镜像中部署各种服务 3.退出容器 4.使用下面命令将容器生成新的镜像 现在我们在这个容器里做了一些配置&#xff0c;我们要把他做成自己镜像 docker commit -m "centos7_123" -a "tarr…

ArkTS-DevEco Studio打开预览器报错

下载官网Codelab案例&#xff0c;打开预览器报错 Failed to start the service process. Make sure the path specified by nodejs.dir in the local.properties file is correct. 解决方案 在编辑器设置中找到node安装路径 将" local.properties"文件中的"nod…

老泮识趣:难忘何家桥

回忆何家桥往事&#xff0c;写了篇《消失的何家桥》&#xff0c;没想到点击率如此高&#xff0c;出乎意料。网友的共鸣可见&#xff0c;城市发展的今天&#xff0c;乡情是个美好的存在&#xff0c;清贫、朴实&#xff0c;丝毫不影响美感。由于大家的鼓励&#xff0c;触动了我再…

电力变压器行业分析:预计2029年将达到84亿元

随着中国“节能降耗”政策的不断深入&#xff0c;国家鼓励发展节能型、低噪音、智能化的配电变压器产品。在网运行的部分高能耗配电变压器已不符合行业发展趋势&#xff0c;面临着技术升级、更新换代的需求&#xff0c;未来将逐步被节能、节材、环保、低噪音的变压器所取代。 电…

PyBullet安装与学习

PyBullet 支持加载 URDF、SDF、MJCF 等多种机器人描述文件&#xff0c;并提供正/逆向运动学、正/逆向动力学、碰撞检测、射线相交查询等功能。 pip install pybullet 安装后会在 Python 环境的 lib/site-packages 中出现以下文件夹&#xff1a; pybullet_data&#xff1a;存放…

VERAS:AI驱动的Revit可视化渲染插件

Veras 是一款基于生成式AI 的可视化工具&#xff0c;可以使用自然语言生成3D渲染效果&#xff0c;兼容Revit、Rhino 和 SketchUp。Veras for Revit工具使用 Revit 模型内部的 3D 视图。 NSDT工具推荐&#xff1a; Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编…

Spine深入学习 —— 换装

Spine深入学习————换装 数据对象和实例对象的关系与区别 数据对象是无状态的&#xff0c;可在任意数量的骨架实例间共用。有对应实例数据的数据对象类名称以“Data”结尾&#xff0c;没有对应实例数据的数据对象则没有后缀&#xff0c;如附件、皮肤及动画。 实例对象有许…