可能有很多人,无论是前端还是后端,无论是JAVA还是Python还是C,都应该跟JSON这种数据格式打过交道,那么有没有仔细的想过,什么叫JSON?
JSON是一种轻量级的数据交换格式。它基于JavaScript语言的对象表示法,但独立于其语言,几乎所有的编程语言都可以解析和生成JSON数据。JSON的设计初衷是为了易于人们阅读和编写,同时也易于机器解析和生成。
一、JSON的基本结构
它是由两种结构组成的:对象(object)和数组(array)。
在Java中的JSON处理库中,通常用 JSONObject
和 JSONArray
类来表示这两种结构。
1.1 JSONObject
JSONObject代表一个JSON中的键值对象,这个对象以大括号包围,每个键值对使用,
隔开,键与值使用:
隔开,一个JSONObject类似于这样:
- 对象是一个无序的“键/值对”集合。
- 用花括号
{ }
包裹。 - 键必须是字符串,值可以是字符串、数字、布尔值、数组、对象或null。
{"name": "John","age": 30,"isStudent": false,"address": {"street": "123 Main St","city": "New York"}
}
1.2 JSONArray
在JSON中,JSONArray代表一个数组,使用中括号包围,每个元素使用逗号隔开。一个JSONArray类似于这样:
- 数组是一个有序的值集合。
- 用方括号
[]
包裹。 - 数组中的值可以是任何类型,包括对象和其他数组。
["Apple","Banana","Cherry"
]
1.3 JSON 的数据类型
JSON支持以下几种数据类型:
- 字符串(String):必须用双引号包围。例如 "Hello World"
- 数字(Number):可以是整数或浮点数。例如 42 或 3.14
- 布尔值(Boolean):表示真或假,取值为 true 或 false
- 数组(Array):一组有序的值。例如 ["apple", "banana", "cherry"]
- 对象(Object):一组键值对。例如 {"name": "John", "age": 30}
- null:表示空值。例如 null
1.4
相互关系:
- JSONObject 和 JSONArray 是JSON数据结构的具体表示。
- JSONObject 可以包含多个 JSONArray 作为其值,反之亦然,JSONArray 也可以包含多个 JSONObject 作为其元素。
- 它们可以互相嵌套,从而形成复杂的JSON结构。
{"name": "Alice","age": 25,"isStudent": true,"grades": [90, 88, 92],"address": {"street": "456 Elm St","city": "Los Angeles","state": "CA"},"courses": [{"name": "Math", "credits": 3},{"name": "Science", "credits": 4}]
}
我们看到 JSONObject
包含了多个键值对,其中一个值是 JSONArray
,而 JSONArray
中的一个元素又是另一个 JSONObject
。这展示了 JSONObject
和 JSONArray
如何通过嵌套来表达复杂的数据结构。
二、JSON的转换
在Java开发中,JSON、Bean、Map、List之间的相互转换非常常见,通常使用第三方库如来简化这些操作,这里我使用Hutool工具包来进行实例。
第一步:引入Hutool
在POM中引入Hutool:
<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.7.17</version>
</dependency>
2.1 Bean,List,Map转化为JSON
首先看实体类User
然后看我们的工具类:
JSONUtil.toJsonStr 方法
可以将任意对象(Bean、Map、集合等)直接转换为JSON字符串。 如果对象是有序的Map等对象,则转换后的JSON字符串也是有序的。
结果为:
2.2 JSON转Bean
从SQL中可以查找的一般都直接转化为对象,但是Redis中经常存储的都是JSON格式,所以要进行转换,这里模拟的JSON数据
2.3 JSON转List
2.4 获取json中某个字段
2.5 JSON转化为数组