JSON-初识+解析

article/2025/10/31 22:51:06

1. JSON

1.1 什么是JSON

JSON(JavaScript Object Notation, JS 对象标记):是一种轻量级的数据交换格式。JSON使用JavaScript 语法来描述数据对象,采用完全独立于语言的文本格式,易于存储和交换。

JSON 的网络媒体类型是 application/json

1.2 JSON使用范围

JSON基于JavaScript编写数据对象,因此,任何JavaScript支持的类型都可以通过JSON来表示。

JSON可以用于通过网络连接序列化和阐述结构化数据。

用于在Web应用程序之间传输数据。

1.3 JSON特点

  • 采用完全独立于编程语言的文本格式来存储和表示数据。
  • 简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。
  • 易于人阅读和编写shiyo,同时也易于机器解析和生成,并有效地提升网络传输效率。

1.4 JSON格式

JSON语法是JavaScript语法的子集。

  • 数据使用key:value对表示
  • 数据间用逗号分隔
  • 使用大括号保存对象
  • 使用方括号保存数组,数组中包含多个对象

1.5 JSON示例

JSON数据的格式为:name:value

  • JSON的key需要加引号,JavaScript不需要引号。
  • JSON的value需要加引号,且为字符串
{ "name" : "JOEL" }
{ "fly" : false }
{ "money" : null }

1.6 JSON使用

使用场景:在后台应用程序中将响应数据封装为JSON格式,传到前台页面之后,需要将JSON格式转换为JavaScript对象,然后再页面中使用该数据。

2. JSON/JavaScript

在JavaScript中定义一个简答的对象:

<script type="text/javascript">var user = {name:"张三",age:22,sex:"男"}
</script>

2.1 JSON与JS的区别

JSON 是 JS 对象的字符串表示法,它使用文本表示一个 JS 对象的信息,本质是一个字符串。

var obj = {a: 'Hello', b: 'World'}; //这是一个对象,注意键名也是可以使用引号包裹的
var json = '{"a": "Hello", "b": "World"}'; //这是一个 JSON 字符串,本质是一个字符串

2.2 JS转为JSON

要实现从JavaScript 对象转换为JSON字符串,使用 JSON.stringify() 方法:

// 将JavaScript对象转为JSON
var json = JSON.stringify(user);
document.write(json);

🔵 输出:{“name”:“张三”,“age”:22,“sex”:“男”}

2.3 JSON转为JS

要实现从JSON字符串转换为JavaScript 对象,使用 JSON.parse() 方法:

// 将JSON对象转为JavaScript
var js = JSON.parse(json);
document.write(js.name, js.age, js.sex);

🔵 输出:张三22男

2.4 JSON接口

JSON与JavaScript对象之间相互转换的方法定义在JSON接口中。

interface JSON {/*** 将JSON对象转为JavaScript* @param JSON对象* @param reviver转换结果的函数。该函数将为对象的每个成员调用。* 如果成员包含嵌套对象,则嵌套对象在父对象之前进行转换。*/parse(text: string, reviver?: (this: any, key: string, value: any) => any): any;/*** 将JavaScript对象转为JSON* @param value要转换的JavaScript值要转换的JavaScript值,通常是一个对象或数组。* @param replacer转换结果的函数。* @param 在返回值JSON文本中添加缩进、空格和换行符,使其更易于阅读。*/stringify(value: any, replacer?: (this: any, key: string, value: any) => any, space?: string | number): string;/*** 将JavaScript对象转为JSON* @param value要转换的JavaScript值,通常是一个对象或数组。* @param 一个字符串和数字的数组,作为一个被批准的列表,用于选择将被字符串化的对象属性。* @param 在返回值JSON文本中添加缩进、空格和换行符,使其更易于阅读。*/stringify(value: any, replacer?: (number | string)[] | null, space?: string | number): string;
}

3. JSON解析工具

JSON 的解析工具:Jackson、Fastjson

3.1 Jackson

3.1.1 什么是Jackson

Jackson: 是当前用的比较广泛的,用来序列化和反序列化 json 的 Java 的开源框架。

3.1.2 Jackson核心

Jackson包含三部分:jackson-core、jackson-annotations、jackson-databind。

jackson-core: 核心包,提供基于"流模式"解析的相关 API,它包括 JsonPaser 和 JsonGenerator。 Jackson 内部实现正是通过高性能的流模式 API 的 JsonGenerator 和 JsonParser 来生成和解析 json;

jackson-annotations: 注解包,提供标准注解功能;

jackson-databind: 数据绑定包, 提供基于"对象绑定" 解析的相关 API ( ObjectMapper ) 和"树模型" 解析的相关 API (JsonNode);基于"对象绑定" 解析的 API 和"树模型"解析的 API 依赖基于"流模式"解析的 API。

3.1.3 ObjectMapper

Jackson 最常用的 API 就是基于"对象绑定" 的 ObjectMapper。

ObjectMapper 通过 writeValue 系列方法 将 java 对 象序列化 为 json,并 将 json 存 储成不同的格式,String(writeValueAsString),Byte Array(writeValueAsString),Writer, File,OutStream 和 DataOutput。

ObjectMapper 通过 readValue 系列方法从不同的数据源像 String , Byte Array, Reader,File,URL, InputStream 将 json 反序列化为 java 对象。

writeValueAsString方法如下:

public String writeValueAsString(Object value) throws JsonProcessingException {SegmentedStringWriter sw = new SegmentedStringWriter(this._jsonFactory._getBufferRecycler());try {this._writeValueAndClose(this.createGenerator((Writer)sw), value);} catch (JsonProcessingException var4) {throw var4;} catch (IOException var5) {throw JsonMappingException.fromUnexpectedIOE(var5);}return sw.getAndClear();
}

3.2 Fastjson

3.2.1 什么是Fastjson

fastjson是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean。

特点:速度快、使用广泛、测试完备、使用简单、功能完备。

3.2.2 Fastjson类

FastJson对于json格式字符串的解析主要用到了三个类:JSON、JSONObject、JSONArray。

  • JSON:fastJson的解析器,用于JSON格式字符串与JSON对象及javaBean之间的转换。
  • JSONObject:fastJson提供的json对象。
  • JSONArray:fastJson提供json数组对象。

image-20211014233851646

public abstract class JSON implements JSONStreamAware, JSONAware {...}
public class JSONObject extends JSON implements Map<String, Object>, Cloneable, Serializable, InvocationHandler {...}
public class JSONArray extends JSON implements List<Object>, Cloneable, RandomAccess, Serializable {...}

4. SpringMVC-JSON

4.1 Jackson方式

4.1.1 导入依赖

pom.xml导入jackson-databind依赖。

<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.13.0</version>
</dependency>

4.1.2 编写POJO

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {private int id;private String name;private String password;
}

4.1.3 输出对象

4.1.3.1 编写Controller

解析步骤:

1️⃣ Step1:实例化ObjectMapper对象

2️⃣ Step2:实例化User对象

3️⃣ Step3:通过writeValueAsString方法将POJO解析为JOSN格式,返回String

@RestController
public class UserController {//@ResponseBody@RequestMapping(value = "/Json")public String test() throws JsonProcessingException {ObjectMapper objectMapper = new ObjectMapper();User user = new User(1, "张三", "123123");String str = objectMapper.writeValueAsString(user);return str;}
}

@RestController:这也是一种Controller,该注解表示不需要再走视图(View)

解释:之前Controller中的方法返回的都是String类型的视图名,而现在我们需要返回JSON,为了不修改视图解析器,我们可以将该注解作用在类上,这样就不再经过视图。

🌈 URL为@RequestMapping的value。

@ResponseBody:指示方法返回值的注释应该绑定到web响应主体上。支持带注释的处理程序方法。

该注解实现的就是不用再走视图。

🌈 @RestController注解实际上就是被@ResponseBody标注的!

4.1.3.1 测试输出

image-20211014223248091

4.1.4 输出集合

4.1.4.1 编写Controller

@RestController
public class UserController {@RequestMapping(value = "/JsonList")public String test2() throws JsonProcessingException {ObjectMapper objectMapper = new ObjectMapper();User user = new User(1, "张三", "123123");User user2 = new User(1, "李四", "123123");List<User> list = new ArrayList<>();list.add(user);list.add(user2);String str = objectMapper.writeValueAsString(list);return str;}
}

4.1.4.2 测试输出

image-20211014223749798

4.1.5 输出日期

4.1.5.1 编写UTILS

思路:

1️⃣ Step1:实例化ObjectMapper对象

2️⃣ Step2:实例化SimpleDateFormat对象,传入日期格式

3️⃣ Step3:通过setDateFormat方法,为ObjectMapper对象指定格式

4️⃣ Step4:通过writeValueAsString方法将日期转为JSON数据并输出字符串

5️⃣ Step5:重载次方法,指定一个默认的日期格式

public class JsonDateUtils {public static String getJsonDate(Object object){return getJsonDate(object, "yyyy-MM-dd HH:mm:ss")}/*** 格式化日期* @param object 日期* @param dateFormat 自定义日期格式* @return 返回日期字符串*/public static String getJsonDate(Object object, String dateFormat) {ObjectMapper objectMapper = new ObjectMapper();SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);objectMapper.setDateFormat(sdf);try {return objectMapper.writeValueAsString(object);} catch (JsonProcessingException e) {e.printStackTrace();}return null;}
}

4.1.5.2 编写Conreoller

@RestController
public class UserController {@RequestMapping("/JsonDate")public String getDate(){return JsonDateUtils.getJsonDate(new Date());}
}

4.1.5.3 测试输出

image-20211014230906168

4.2 Fastjson

4.2.1 导入依赖

<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.78</version>
</dependency>

4.2.2 编写测试类

public class FastJsonTest {public static void main(String[] args) {User user1 = new User(1,"张三","123123");User user2 = new User(2,"李四","123123");User user3 = new User(3,"王五","123123");List<User> list = new ArrayList<>();list.add(user1);list.add(user2);list.add(user3);}
}

4.2.3.1 JAVA转JSON

System.out.println("===Java对象 转为 JSON字符串===");
System.out.println("userJSON: " + JSON.toJSONString(user1));
System.out.println("listJSON: " + JSON.toJSONString(list));/*
输出:
===Java对象 转为 JSON字符串===
userJSON: {"id":1,"name":"张三","password":"123123"}
listJSON: [{"id":1,"name":"张三","password":"123123"},{"id":2,"name":"李四","password":"123123"},{"id":3,"name":"王五","password":"123123"}]
*/

4.2.3.2 JSON转JAVA

System.out.println("===JSON字符串 转为 Java对象===");
System.out.println("user: " + JSON.parseObject(JSON.toJSONString(user1), User.class));
System.out.println("list: " + JSON.parseObject(JSON.toJSONString(list), List.class));/*
输出:
===JSON字符串 转为 Java对象===
user: User(id=1, name=张三, password=123123)
list: [{"password":"123123","name":"张三","id":1}, {"password":"123123","name":"李四","id":2}, {"password":"123123","name":"王五","id":3}]
*/

4.2.3 输出日期

利用Fastjson实现日期的输出,输出效果很上面用Jackson一致。

public static String getDate(Object object){return getDate(object, JSON.DEFFAULT_DATE_FORMAT);
}public static String getDate(Object object, String format){SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format);return JSON.toJSONString(simpleDateFormat.format(object));
}@Test
public void test(){System.out.println(getDate(new Date()));
}

image-20211015001443931

5. 写在最后

JSON常用的解析器还有Goole的gson,但是速度较慢。

 


❤️ END ❤️

http://chatgpt.dhexx.cn/article/yOXD2Vlw.shtml

相关文章

unity协程coroutine 简明教程

本篇内容基于 https://gamedevbeginner.com/coroutines-in-unity-when-and-how-to-use-them/ 以及官方教程 为什么使用协程 协程非常适合设置需要随时间发生变化的游戏逻辑。很自然我们会想到update&#xff0c;update里指出每一帧unity会执行什么操作。协程则可以将代码从up…

浅析Unity协程实现原理

介绍 协程Coroutine在Unity中一直扮演者重要的角色。可以实现简单的计时器、将耗时的操作拆分成几个步骤分散在每一帧去运行等等&#xff0c;用起来很是方便。 但是&#xff0c;在使用的过程中有没有思考过协程是怎么实现的&#xff1f;为什么可以将一段代码分成几段在不同帧执…

Unity协程和线程的区别深入理解(附实验展示)

Unity协程和线程的区别附实验展示 写在前面协程、进程、线程的概念进程与线程的区别协程与线程的区别实验1&#xff1a;协程中执行普通函数实验2&#xff1a;协程中开启另一个协程实验3&#xff1a;协程中开启WWW请求实验4&#xff1a;一个脚本中多个协程访问临界资源实验5&…

Unity 协程 Unity Task UniTask

协程 使用 StartCoroutine 和 IEnumerator yield return null 暂停执行并随后在下一帧恢复 yield return new WaitForSeconds(1f); 延迟1秒 waitfor系列有好几个 WaitForSeconds 和 WaitForSecondsRealtime 的区别 使用缩放时间将协程执行暂停指定的秒数。 实际暂停时间等于…

Unity 协程探究

一、官方手册中的描述 1、Manual/Coroutines 函数在调用时, “从调用到返回” 都发生在一帧之内&#xff0c;想要处理 “随时间推移进行的事务”&#xff0c; 相比Update&#xff0c;使用协程来执行此类任务会更方便。 协程在创建时&#xff0c;通常是一个 “返回值类型 为 …

Unity 协程底层原理解析

1、协程 unity是单线程设计的游戏引擎&#xff0c;unity实际上有多条渲染线程&#xff0c;但对于unity调用我们编写的游戏脚本&#xff0c;都是放在一个主线程当中进行调度的。因此对于我们写的游戏脚本unity是单线程的。 协程不是进程或者线程&#xff0c;它的执行过程更类似…

Unity协程那些事儿

Unity协程那些事儿 1、什么是协程&#xff1f;2、协程的使用3、关于yield4、关于IEnumerator/IEnumerable5、从IEnumerator/IEnumerable到yield6、Unity协程机制的实现原理7、源码分析8、总结 1、什么是协程&#xff1f; 用过Unity的应该都知道协程&#xff0c;今天就给大家来…

Unity⭐️当Unity协程遇到while

文章目录 Unity协程是一个老生常谈的知识点了&#xff0c;但今天博主却差点被一篇文章忽悠了 那就是这句话&#xff1a; 为什么说这句话不对呢 那就是当遇到while时&#xff0c;我们再来检验这句话的正确性&#xff1a; 按上面那句话&#xff0c;应该每次yield return后&…

深入探讨Unity协程及其使用

深入探讨Unity协程及其使用 协程 协程在Unity中是个很重要的东东&#xff0c;相信很多人都使用过&#xff0c;它能够非常方便的进行异步等待操作&#xff0c;可以说&#xff0c;用好协程&#xff0c;可以使你的代码更加优雅&#xff0c;然而&#xff0c;如果用不好&#xff0…

Unity 协程、模拟协程

理解协程 IEnumeratoryield 强大的迭代器 IEnumerator 就是一个函数容器 里面保存了一个一个的函数 IEnumator会依次执行每个函数 而每个函数都有一个返回值 保存在IEnumator.Currect里面 看下面这个例子 IEnuermator start_Coroutine(){Debug.Log("HellWord")…

unity 协程特点

协程 一. Unity中使用协程1. 什么是协程2. 如何使用3. 协程的应用场景创建补间动画打字机效果异步加载资源 4. 注意事项 二. Unity协程的底层原理1. 协程本体&#xff1a;C#的迭代器函数2. 协程调度&#xff1a;MonoBehaviour生命周期中实现3. Unity协程的架构 三. 扩展Unity的…

Unity协程深入及实现

Unity协程深入 文章目录 Unity协程深入Unity协程简介Unity协程的用法协程的原理协程的缺陷自己实现协程参考 Unity协程简介 Unity中的协程能够允许我们将一个任务分散到多个帧中。注意&#xff1a;协程&#xff08;协同执行&#xff09;和多线程有本质区别。 协程不是线程&…

unity 协程

首先声明&#xff1a;协程不是线程&#xff0c;协程在主线程中运行&#xff0c;而线程是单独开辟线程 以下是u3d关于协程的调用机制的解释&#xff1a; “在Unity3D中&#xff0c;使用MonoBehaviour.StartCoroutine方法即可开启一个协同程序&#xff0c;也就是说该方法必须在…

【Unity】Unity协程(Coroutine)的原理与应用

文章目录 前言一、什么是协程二、应用场景1.异步加载资源2.将一个复杂程序分帧执行3.定时器 三、协程的使用注意事项 四、Unity协程的底层原理1. 协程本体&#xff1a;C#的迭代器函数2. 协程调度&#xff1a;MonoBehaviour生命周期中实现 五、参考资料 前言 本文是作者在学习U…

Unity-协程详解

1. 简介 unity的**协程&#xff08;Coroutine&#xff09;**只是在c#的基础上做了一层封装&#xff0c;其实yield是C#的关键字。 unity协程是一个能够暂停协程执行&#xff0c;暂停后立即返回主函数&#xff0c;执行主函数剩余的部分&#xff0c;直到中断指令完成后&#xff…

Unity 协程(Coroutine)原理与用法详解

前言&#xff1a; 协程在Unity中是一个很重要的概念&#xff0c;我们知道&#xff0c;在使用Unity进行游戏开发时&#xff0c;一般&#xff08;注意是一般&#xff09;不考虑多线程&#xff0c;那么如何处理一些在主任务之外的需求呢&#xff0c;Unity给我们提供了协程这种方式…

linux的用户管理

1.linux的用户管理 linux的用户管理和组管理&#xff0c; 每个用户都必须要有一个且仅有一个初始组&#xff0c;可以有多个附加组&#xff0c;使用useradd命令创建用户时&#xff0c;如果没有指定初始组&#xff0c;系统默认会创建一个于其同名的组。 用户和组信息保存在4个文…

Linux用户管理练习

Linux下用户分为3类&#xff1a;超级用户&#xff08;root&#xff09;、系统用户、普通用户。 超级用户的用户名为root&#xff0c;它具有一切操作权力&#xff0c;因此为安全起见&#xff0c;建议不要轻易的在root账户下面对文件进行操作。在Linux操作系统的字符界面&#xf…

Linux用户管理工具

Linux用户管理工具 1. 用户 1.1创建用户 useradd -m username该命令为用户创建相应的帐号和用户目录/home/username&#xff1b; passwd username该命令为用户设置密码 1.2 删除用户 userdel -r username不带选项使用 userdel&#xff0c;只会删除用户。用户的家目录将…