JSON全解析:语法、转换与FastJson应用指南

大家好,我是袁庭新。JSON是一种轻量级、基于文本、开放式的数据交换格式。在数据交换的世界里,JSON 扮演着重要角色。它究竟为何备受青睐?下面就为您详细解读其奥秘与应用。 

1.JSON简述

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

JSON的特点:

  • JSON是一种轻量级的数据交换格式。
  • JSON采用完全独立于语言的文本格式,就是说不同的编程语言JSON数据是一致的。
  • JSON易于人阅读和编写,同时也易于机器解析和生成(一般用于提升网络传输速率)。

2.XML与JSON的区别

1.XML:可扩展标记语言,是一种用于标记电子文件使其具有结构性的标记语言。 

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

3.相同点:它们都可以作为一种数据交换格式。

4.区别:

  • XML是重量级的,JSON是轻量级的,XML在传输过程中比较占带宽,JSON占带宽少,易于压缩。
  • XML和JSON都用在项目交互下,XML多用于做配置文件,JSON用于数据交互。

3.JSON语法格式

3.1 JSON语法介绍

我们先来看一下JSON数据:

{"id": 110,"name": "李会长","age": 24
}

语法注意: 

  1. 外面由{}括起来
  2. 数据以"键:值"对的形式出现(其中键多以字符串形式出现,值可取字符串,数值,甚至其他JSON对象)
  3. 每两个"键:值"对以逗号分隔(最后一个"键:值"对省略逗号)
  4. 参数值如果是string类型,就必须加引号,如果是数字类型,引号可加可不加

遵守上面4点,便可以形成一个JSON对象。

3.2 JSON案例

1.创建一个Maven类型的项目,项目名称:json_demo。

2.在json_demo项目的src/main下创建一个webapp目录。

3.在File - Project Structure - Facets选项下配置项目的web.xml文件。

4.声明JSON格式的对象、数组以及集合的数据格式。在项目的webapp目录下创建一个json_demo.html的页面。

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>JSON</title></head><body><script>// 自定义JSON数据格式 (Java中的对象)var person = {"eid": 1001,"username": "tom","sex": "女","age": 12};console.log(person);// 数组格式var persons = {"persons": [{"eid": 1001,"username": "tom","sex": "女","age": 12},{"eid": 1002,"username": "jack","sex": "男","age": 22}]};console.log(persons);// 集合var list = [{"eid": 1001,"username": "老五","sex": "女","age": 12},{"eid": 1002,"username": "会长","sex":"男","age":12}];console.log(list);</script></body>
</html>

4.JSON数据的转换

目前,前后端的AJAX通讯几乎用的都是JSON格式的数据,所以在开发的过程中,我们经常会涉及到JSON数据的转换。 

JSON数据与Java对象的转换,见下图:

4.1 FastJson介绍

1.FastJson是一个Java库,可以将Java对象转换为JSON格式,当然它也可以将JSON字符串转换为Java对象。

2.FastJson特点如下:

  • 能够支持将Java Bean序列化成JSON字符串,也能够将JSON字符串反序列化成Java Bean。
  • 顾名思义,FastJson操作JSON的速度是非常快的。
  • FastJson无其他包的依赖,使用比较方便。

4.2 FastJson的使用

在Maven项目中使用FastJson库,需要提前在Maven的配置文件中添加此FastJson包的依赖。

<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.3</version>
</dependency>
<dependency><groupId>com.colobu</groupId><artifactId>fastjson-jaxrs-json-provider</artifactId><version>0.3.1</version>
</dependency>

4.3 Java对象转换为JSON格式

4.3.1 项目配置

在pom.xml文件中添加Lombok与junit测试单元相关的依赖。

<!-- Lombok -->
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.0</version><scope>provided</scope>
</dependency>
<!-- 测试单元 -->
<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13</version><scope>test</scope>
</dependency>
4.3.2 代码实现

1.定义一个名为Person的JavaBean类。

package com.cy.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;@Data
@AllArgsConstructor
public class Person {private int eid;private String username;private int age;private String birthday;
}

2.可以使用JSON.toJSONString()将Java对象转换为JSON对象。

package com.cy;
import com.alibaba.fastjson.JSON;
import com.cy.pojo.Person;
import org.junit.Test;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;public class FastJsonTests {@Testpublic void javaBeanToJSON() {// 创建Person对象Person person = new Person(1001,"码云",15, "2025-07-03 19:54:33");// 使用JSON对象的toJSONString方法将Java对象转换为JOSN数据String jsonStr = JSON.toJSONString(person);// {"age":15,"birthday":"2025-07-03 19:54:33","eid":1001,"username":"码云"}System.out.println(jsonStr);}// 数组转Json@Testpublic void arrayToJSON() {// 创建Person对象Person p1 = new Person(1001, "码云", 15, "2025-07-03 19:54:33");Person p2 = new Person(1002, "虎子", 13, "2025-08-04 17:42:30");Person p3 = new Person(1003, "小斌", 18, "2025-09-05 15:51:28");Person[] persons = new Person[] {p1, p2, p3};// 使用JSON对象的toJSONString方法将Java对象转换为JOSN数据String jsonStr = JSON.toJSONString(persons, true);// [{"age":15,"birthday":"2025-07-03 19:54:33","eid":1001,"username":"码云"},{"age":13,"birthday":"2025-08-04 17:42:30","eid":1002,"username":"虎子"},{"age":18,"birthday":"2025-09-05 15:51:28","eid":1003,"username":"小斌"}]System.out.println(jsonStr);}// List集合转Json@Testpublic void listToJSON() {// 创建Person对象Person p1 = new Person(1001, "码云", 15, "2025-07-03 19:54:33");Person p2 = new Person(1002, "虎子", 13, "2025-08-04 17:42:30");Person p3 = new Person(1003, "小斌", 18, "2025-09-05 15:51:28");List<Person> list = new ArrayList<>();Collections.addAll(list, p1, p2, p3);// 使用JSON对象的toJSONString方法将Java对象转换为JOSN数据String jsonStr = JSON.toJSONString(list);// [{"age":15,"birthday":"2025-07-03 19:54:33","eid":1001,"username":"码云"},{"age":13,"birthday":"2025-08-04 17:42:30","eid":1002,"username":"虎子"},{"age":18,"birthday":"2025-09-05 15:51:28","eid":1003,"username":"小斌"}]System.out.println(jsonStr);}
}

3.FastJson中的@JSONField注解。通过@JSONField我们可以自定义字段的名称进行输出,并控制字段的排序,还可以进行序列化标记。 

  • 指定name属性,指定字段的名称 
  • 使用ordinal属性,指定字段的顺序
  • 使用serialize属性,指定字段是否序列化
package com.cy.pojo;
import com.alibaba.fastjson.annotation.JSONField;
import lombok.AllArgsConstructor;
import lombok.Data;@Data
@AllArgsConstructor
public class Person {// 自定义输出排序@JSONField(ordinal = 1)private int eid;// 自定义输出的名称, 并且进行输出排序@JSONField(name = "userName",ordinal = 2)private String username;@JSONField(ordinal = 3)private int age;// 排除不需要序列化的字段@JSONField(serialize = false)private String birthday;
}

4.4 JSON格式转换为Java对象 

4.4.1 常用方法

1.JSON.parseObject()

  • 可以使用JSON.parseObject()将JSON字符串转换为Java对象。 
  • 注意反序列化时为对象时,必须要有默认无参的构造方法,否则会报异常。

2.JSON.parseArray()

  • 可以使用JSON.parseArray()将JSON字符串转换为集合对象。 
4.4.2 代码实现

1.在Person类中添加无参构造方法。

public Person() {
}

2.在FastJsonTests测试类中添加JSON格式转换为Java对象的相应方法。

@Test
public void jsonToJavaBean() {String json01 = "{\n" +"            \"eid\": 1001,\n" +"            \"username\": \"tom\",\n" +"            \"sex\": \"女\",\n" +"            \"age\": 12\n" +"        }";Person person = JSON.parseObject(json01, Person.class);System.out.println(person);String json02 = "[\n" +"            {\n" +"                \"eid\": 1001,\n" +"                \"username\": \"老五\",\n" +"                \"sex\": \"女\",\n" +"                \"age\": 12\n" +"            },\n" +"            {\n" +"                \"eid\": 1002,\n" +"                \"username\": \"会长\",\n" +"                \"sex\":\"男\",\n" +"                \"age\":12\n" +"            }\n" +"        ]";List<Person> list  = JSON.parseArray(json02, Person.class);System.out.println(list);
}

5.总结

本文主要介绍了 JSON 相关知识。首先阐述了 JSON 是基于 ECMAScript 子集的轻量级数据交换格式,具有独立于编程语言、易读写和解析等特点。接着对比了 XML 与 JSON,XML 较重,JSON 轻量且在传输和压缩上更具优势,用途也有所不同。然后讲解了 JSON 语法,包括数据的结构形式等。还介绍了 FastJson,其能实现 Java 对象与 JSON 相互转换,具有速度快、无依赖等特点,并详述了在 Maven 项目中的配置及转换代码的实现,涵盖对象、数组、集合等类型。 

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

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

相关文章

Java模拟路由协议-rip(路由器仿真实验)

前言&#xff1a; 好久不见&#xff0c;有段时间没有写文章了&#xff0c;本篇文章&#xff0c;由Blue我带大家来复现rip协议。我们以 b站湖南教师匠所讲rip的视频中的例子为我这篇文章所模拟的路由路径 如图&#xff1a; 模拟路径 视频&#xff1a;http://【深入浅出计算机网络…

吴恩达深度学习——神经网络介绍

文章内容来自BV11H4y1F7uH&#xff0c;仅为个人学习所用。 文章目录 什么是神经网络引入神经网络神经元激活函数ReLU隐藏单元 用神经网络进行监督学习监督学习与无监督学习举例 什么是神经网络 引入 已经有六个房子的数据集&#xff0c;横轴为房子大小&#xff0c;纵轴为房子…

ChatGPT 摘要,以 ESS 作为你的私有数据存储

作者&#xff1a;来自 Elastic Ryan_Earle 本教程介绍如何设置 Elasticsearch 网络爬虫&#xff0c;将网站索引到 Elasticsearch 中&#xff0c;然后利用 ChatGPT 使用我们的私人数据来总结对其提出的问题。 Python 脚本的 Github Repo&#xff1a;https://github.com/Gunner…

数智化转型 | 星环科技Defensor 助力某银行数据分类分级

在数据驱动的金融时代&#xff0c;数据安全和隐私保护的重要性日益凸显。某银行作为数字化转型的先行者&#xff0c;面临着一项艰巨的任务&#xff1a;如何高效、准确地对分布在多个业务系统、业务库与数仓数湖中的约80万个字段进行数据分类和分级。该银行借助星环科技数据安全…

【JDBC】数据库连接的艺术:深入解析数据库连接池、Apache-DBUtils与BasicDAO

文章目录 前言&#x1f30d; 一.连接池❄️1. 传统获取Conntion问题分析❄️2. 数据库连接池❄️3.连接池之C3P0技术&#x1f341;3.1关键特性&#x1f341;3.2配置选项&#x1f341;3.3使用示例 ❄️4. 连接池之Druid技术&#x1f341; 4.1主要特性&#x1f341; 4.2 配置选项…

Linux Bash 中使用重定向运算符的 5 种方法

注&#xff1a;机翻&#xff0c;未校。 Five ways to use redirect operators in Bash Posted: January 22, 2021 | by Damon Garn Redirect operators are a basic but essential part of working at the Bash command line. See how to safely redirect input and output t…

C语言内存之旅:从静态到动态的跨越

大家好&#xff0c;这里是小编的博客频道 小编的博客&#xff1a;就爱学编程 很高兴在CSDN这个大家庭与大家相识&#xff0c;希望能在这里与大家共同进步&#xff0c;共同收获更好的自己&#xff01;&#xff01;&#xff01; 本文目录 引言正文一 动态内存管理的必要性二 动态…

AI时代:弯道超车的新思维与实践路径

大家好&#xff0c;我是herosunly。985院校硕士毕业&#xff0c;现担任算法研究员一职&#xff0c;热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名&#xff0c;CCF比赛第二名&#xff0c;科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的…

【Spring】定义的Bean缺少隐式依赖

问题描述 初学 Spring 时&#xff0c;我们往往不能快速转化思维。例如&#xff0c;在程序开发过程中&#xff0c;有时候&#xff0c;一方面我们把一个类定义成 Bean&#xff0c;同时又觉得这个 Bean 的定义除了加了一些 Spring 注解外&#xff0c;并没有什么不同。所以在后续使…

『 实战项目 』Cloud Backup System - 云备份

文章目录 云备份项目服务端功能服务端功能模块划分客户端功能客户端模块划分 项目条件Jsoncpp第三方库Bundle第三方库httplib第三方库Request类Response类Server类Client类搭建简单服务器搭建简单客户端 服务端工具类实现 - 文件实用工具类服务器配置信息模块实现- 系统配置信息…

网络编程 | UDP组播通信

1、什么是组播 在上一篇博客中&#xff0c;对UDP的广播通信进行了由浅入深的总结梳理&#xff0c;本文继续对UDP的知识体系进行探讨&#xff0c;旨在将UDP的组播通信由浅入深的讲解清楚。 组播是介于单播与广播之间&#xff0c;在一个局域网内&#xff0c;将某些主机添加到组中…

【无标题】微调是迁移学习吗?

是的&#xff0c;微调&#xff08;Fine-Tuning&#xff09;可以被视为一种迁移学习&#xff08;Transfer Learning&#xff09;的形式。迁移学习是一种机器学习方法&#xff0c;其核心思想是利用在一个任务上学到的知识来改进另一个相关任务的性能。微调正是通过在预训练模型的…

【HarmonyOS NAPI 深度探索12】创建你的第一个 HarmonyOS NAPI 模块

【HarmonyOS NAPI 深度探索12】创建你的第一个 HarmonyOS NAPI 模块 在本篇文章中&#xff0c;我们将一步步走过如何创建一个简单的 HarmonyOS NAPI 模块。通过这个模块&#xff0c;你将能够更好地理解 NAPI 的工作原理&#xff0c;并在你的应用中开始使用 C 与 JavaScript 的…

【电视盒子】HI3798MV300刷机教程笔记/备份遥控码修复遥控器/ADB/线刷卡刷/电视盒子安装第三方应用软件

心血来潮&#xff0c;看到电视机顶盒满天飞的广告&#xff0c;想改造一下家里的电视盒子&#xff0c;学一下网上的人刷机&#xff0c;但是一切都不知道怎么开始&#xff0c;虽然折腾了一天&#xff0c;以失败告终&#xff0c;还是做点刷机笔记。 0.我的机器 年少不会甄别&…

Python基于OpenCV和PyQt5的人脸识别上课签到系统【附源码】

博主介绍&#xff1a;✌Java老徐、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&…

【FPGA】MIPS 12条整数指令【1】

目录 修改后的仿真结果 修改后的完整代码 实现bgtz、bltz、jalr 仿真结果&#xff08;有问题&#xff09; bltz------并未跳转&#xff0c;jCe&#xff1f; 原因是该条跳转语句判断的寄存器r7&#xff0c;在该时刻并未被赋值 代码&#xff08;InstMem修改前&#xff09; i…

Java面试专题——常见面试题1

引入 本文属于专题中的常见面试题模块&#xff0c;属于面试时经常遇到的&#xff0c;适合需要面试的小伙伴做面试前复习准备用&#xff0c;后续会持续补充 1.面向对象基本特征 面向对象的基本特征是什么&#xff1f;怎么理解&#xff1f; 面向对象的基本特征是封装、继承、…

VUE实现简单留言板(Timeline+infinite scroll+Springboot+Hibernate)

先贴出效果图&#xff1a; 留言按照倒序排列。在底部的文本框内输入留言后&#xff0c;点击“留言”按钮&#xff0c;留言将保存至数据库中&#xff0c;同时刷新网页&#xff0c;新留言出现在顶部。 当滚动条到底部时&#xff0c;自动调用加载函数&#xff0c;显示更多早期留…

Java基础(3)

Java 数据类型详解 九、运算符 1. 基本运算符 Java 提供了多种运算符来执行不同的操作&#xff1a; 算术运算符&#xff1a;&#xff08;加&#xff09;、-&#xff08;减&#xff09;、*&#xff08;乘&#xff09;、/&#xff08;除&#xff09;、%&#xff08;取模&…

电力场景红外测温图像绝缘套管分割数据集labelme格式2436张1类别

数据集格式&#xff1a;labelme格式(不包含mask文件&#xff0c;仅仅包含jpg图片和对应的json文件) 图片数量(jpg文件个数)&#xff1a;2436 标注数量(json文件个数)&#xff1a;2436 标注类别数&#xff1a;1 标注类别名称:["arrester"] 每个类别标注的框数&am…