无注释:JSON数据中不支持注释,这使得JSON文件的可读性变得较差; 无标准:JSON没有统一的标准定义,各种实现之间有一定的差异; 不支持二进制数据:JSON只支持文本数据,不支持二进制数据,这在一些场景中可能会受到限定; 可读性差:由于JSON的格式比较大略,因此在一些繁芜的数据构造中,可能会涌现可读性差的情形。
但总的来说,瑕不掩瑜,JSON作为一种非常方便、易于利用的数据格式,具有良好的跨平台性和易扩展性,常用于前后端数据交互、移动运用开拓、IoT运用等场景中。
正是基于以上特点,以是在当代开拓中,JSON比XML更常用。毕竟JSON具有更大略、更清晰的语法和构造,同时也比XML更轻量级、更易于解析和处理。此外,JSON也更适宜于Web运用程序和移动运用程序,由于它可以更快地在客户端和做事器之间传输数据。当然在某些分外的运用处景中,如数据交流和存储等,XML仍旧是一种主要的数据格式。请大家来看看壹哥做的JSON与XML比拟总结,如下表所示:

JSON
XML
格式
轻量、易读
冗长、繁芜
数据类型
数组、工具、字符串、数字、布尔
数组、工具、字符串、数字、布尔
解析库
Jackson、Gson
DOM、SAX、JAXB
可读性
易于阅读和理解
须要熟习格式和标签
运用处景
前后端数据交互、API数据传输
数据存储、传输、配置
大家可以根据自己的实际须要,选择得当的格式进行数据的存储和传输。
3. 利用场景我们现在知道,JSON作为一种轻量级的数据交流格式,具有易读性、易于编写和解析的特点,因此常常用于前后端数据交互。详细来说,常常会用于以下这些场景中:
Web开拓中,前后端数据交互。 移动运用开拓中,客户端与做事器数据交互。 IoT运用中,设备与云端数据交互。 大数据运用中,数据交流和存储。 日志处理中,日志数据的存储和剖析。 软件测试中,数据的天生和验证。 其他各种数据交流场景。
除了以上这些运用之外,当然还有很多其他的利用场景,在此壹哥就不再细说了。
二. JSON语法1. 基本构成JSON文档有 JSON工具和JSON数组 两种基本类型, 这两种基本类型又紧张由以下几个部分组成:
工具(Object) :由一组键值对组成,利用大括号({})包含,键值对之间利用逗号(,)分隔; 数组(Array) :由一组有序的值组成,利用中括号([])包含,值之间利用逗号(,)分隔; 值(Value) :由一组有序的值组成,利用中括号([])包含,值之间利用逗号(,)分隔; 键(Key) :一个字符串,用于表示工具中的一个键值对的键; 字符串(String) :由一组字符组成。在JSON中,字符串必须利用双引号("")包含; 数字(Number) :一个整数或浮点数; 布尔值(Boolean) :true或false; 空值(Null) :表示一个空值,只有一个关键字null。
个中,JSON工具要利用大括号{} 包裹起来,在大括号{}内部可以包含多个键值对。每个键值对由一个键和一个值组成,键和值之间利用冒号:分隔,而多个键值对之间要利用逗号,分隔。键值对的键是一个字符串,值可以是任意类型的数据,可以是数字、字符串、布尔值、数组或其他JSON工具。如下所示:
json
复制代码
{ "name": "逐一哥", "age": 25, "email": "yyg@example.com" }
上面的JSON工具有三个键值对,分别是name、age和email,它们的值分别是字符串、数字和字符串类型。
而JSON数组可以看作是一组有序的值,全体数组要利用中括号[] 包裹起来。在JSON数组中可以包裹其他的JSON工具或数组,进行多重嵌套。数组中的每个值也都可以是任意类型的数据(包括字符串、数字、工具、数组等),值之间同样利用逗号,分隔。如下所示:
json
复制代码
[ "apple", "banana", "cherry", { "name": "逐一哥", "age": 30 }, [1, 2, 3] ]
上面的JSON数组有五个值,分别是三个字符串、一个工具和一个数组。个中,第四个值是一个JSON工具,第五个值是一个JSON数组。
虽然JSON工具和JSON数组在语法上有所不同,但它们都是用来表示JSON数据的常用构造。在实际运用中,我们可以将它们组合嵌套起来构建出更加繁芜的数据构造,以知足不同的需求。比如下面这个JSON文档:
json
复制代码
{ "name": "逐一哥", "age": 25, "email": "yyg@126.com", "hobbies": [ "用饭饭", "音乐", { "name": "钢琴", "level": 3 } ] }
在上面这个文档中,壹哥定义了一个包含四个键值对的JSON工具,个中name、age和email是字符串类型的key。hobbies是一个包含三个元素的JSON数组,个中前两个元素是字符串,第三个元素又是一个JSON工具,包含name和level两个键值对。把稳,在JSON数组中可以包含任意类型的元素,包括字符串、数字、工具、数组等。
为了让大家更好地搞清楚JSON语法的构成,接下来壹哥再分别给大家讲解一下JSON语法中的各个组成部分。
2. 工具JSON工具是一组由键值对组成的无序凑集,用大括号{}包裹。每个键值对之间利用逗号,分隔。键是一个字符串,值可以是任意类型的数据,包括工具、数组、字符串、数字、布尔值和空值。我们来看下面这个包含了三个键值对的JSON工具:
json
复制代码
{ "name": "逐一哥", "age": 20, "city": "上海" }
3. 数组JSON数组是一组有序的值的凑集,用中括号[]包裹。每个值之间利用逗号,分隔,值可以是任意类型的数据,包括工具、数组、字符串、数字、布尔值和空值。我们来看下面这个包含了三个值的JSON数组:
json
复制代码
["apple", "banana", "cherry"]
4. 值JSON的值可以是任意类型的数据,包括工具、数组、字符串、数字、布尔值和空值。例如:
json
复制代码
{ "name": "逐一哥", "age": 20, "isMarried": false, "hobbies": ["读书", "运动", "音乐"], "address": { "street": "上海同济岔路支路199号", "city": "上海", "zipcode": "10001" }, "phoneNumbers": [ { "type": "home", "number": "555-1234" }, { "type": "work", "number": "555-5678" } ] }
上面的JSON工具中包含了字符串、数字、布尔值、数组和工具等多种类型的值。
5. 键JSON工具中的键必须是字符串类型,要用双引号""包裹。键该当是唯一的,重复的键会被覆盖。例如:
json
复制代码
{ "name": "逐一哥", "age": 30, "city": "上海" }
6. 字符串JSON字符串是由双引号""包含的任意Unicode字符序列,字符串中可以包含转义字符,如下表所示:
转义字符
描述
\"
双引号
\\
反斜杠
\/
正斜杠
\b
退格符
\f
换页符
\n
换行符
\r
回车符
\t
水平制表符(tab)
\uXXXX
Unicode代码(XXXX表示四位数字)
例如:
json
复制代码
{ "name": "逐一哥", "city": "上海", "address": "123 Main Street\\nApt 4B" }
7. 数字JSON中的数字可以是整数或浮点数,可以带正负号和小数点。例如:
json
复制代码
{ "age": 30, "price": 12.99, "temperature": -5.6 }
8. 布尔值JSON中的布尔值只有两个取值,即true和false。例如:
json
复制代码
{ "isMarried": true, "hasChildren": false }
9. 空值JSON中的空值表示为null。例如:
json
复制代码
{ "name": "逐一哥", "address": null }
在JSON解析时,我们可以将null转换为Java中的null值,表示短缺数据。
熟习了JSON的基本语法之后,壹哥再来带大家学习如何实现JSON解析,该部分的内容紧张包括将一个Java工具转为JSON字符串,和把JSON字符串转为对应的Java工具。
三. JSON解析1. 概述我们先来看看什么是JSON解析。
JSON解析便是把利用JSON格式编写的数据,转换为打算机程序可以利用的数据类型。在Java中,有许多JSON解析库可供我们进行利用,比如Jackson、FastJSON、Gso n等。接下来壹哥紧张是结合Java推举的Jackson来给大家先容JSON解析的观点、事理和详细实现方法。
2. JSON解析事理在我们开始进行JSON解析之前,我们先来看看解析的实现事理。
JSON解析的实现事理实在便是将JSON字符串转换为Java工具,或反过来将Java工具转换为JSON字符串。个中,将Java工具转换为JSON字符串的过程称为序列化;反之,将JSON字符串转换为Java工具的过程称为反序列化。在Java中,我们常日是利用反射技能来实现JSON解析,即根据JSON字符串中的数据类型,利用Java的反射机制动态地创建出对应的Java工具,并将JSON字符串中的数据赋值给Java工具的各个属性。
3. Jackson简介3.1 概述Jackson是一个盛行的Java JSON解析库,可以将JSON字符串转换为Java工具,也可以将Java工具转换为JSON字符串。它支持流式API、数据绑定和树模型等多种解析办法,同时还给我们供应了许多表明,用于掌握JSON序列化和反序列化。具有性能高、利用大略等优点。
3.2 常用API我们在利用Jackson开拓时,肯定会用到ObjectMapper类,该类是Jackson框架中最核心的类之一,它可以将Java工具转换为JSON字符串,或反过来将JSON字符串转换为Java工具。以下是ObjectMapper类的一些常用方法:
readValue:将JSON字符串转换为Java工具; writeValueAsString:将Java工具转换为JSON字符串; writeValue:将Java工具写入输出流中。
这几个方法须要大家牢牢记住,除此之外,Jackson中还有以下几个常用的表明:
@JsonProperty:用于在JSON属性名和Java属性名之间建立起映射关系; @JsonFormat:用于指定日期类型的格式; @JsonIgnore:用于指定某个属性,不参与序列化和反序列化; @JsonInclude:用于指定某个属性的条件序列化和反序列化。
3.3 核心依赖由于Jackson并不是Java本身自带的API,以是如果我们想在Java中利用Jackson,就须要导入干系的依赖。如果我们是在Maven项目中,可以通过如下坐标导入依赖:
xml
复制代码
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.12.3</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.12.3</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.12.3</version> </dependency>
个中,jackson-core和jackson-databind是Jackson最常用的模块,里面包含了JSON序列化和反序列化的核心功能。我们还可以根据须要导入其他的Jackson模块,如jackson-annotations等。由于我们现在还没有学习Maven,以是只好手动导入干系的依赖了。在导入依赖之后,我们就可以开始利用Jackson进行JSON解析了,请大家连续往下看。
3. 序列化我们在进行前后端数据交互时,前端常日是利用JSON格式来通报数据,后端则须要将这些JSON格式的数据转换为Java工具进行处理。同时,后端也须要将Java工具转换为JSON格式,以便前端利用。以是前后端之间就须要进行不同格式之间的转换,这便是序列化和反序列化。壹哥在前面讲过,序列化便是将Java工具转换为JSON字符串的过程 。
3.1 工具转字符串我们先来看一个大略的序列化代码,将一个Java工具转为json字符串,如下所示:
java
复制代码
import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; / @author 逐一哥Sun / public class Demo01 { public static void main(String[] args) { try { //创建一个Person工具 Person person=new Person(); person.setName("逐一哥"); person.setAge(20); person.setAddress("上海校区"); //创建一个ObjectMapper工具映射工具 ObjectMapper mapper = new ObjectMapper(); //序列化:将Java工具转为json字符串 String json = mapper.writeValueAsString(person); System.out.println("json="+json); } catch (JsonProcessingException e) { e.printStackTrace(); } } }
实行结果如下图所示:
3.2 凑集转字符串
除了可以将单个Java工具转为JSON字符串之外,我们还可以将Java数组、凑集等繁芜工具类型转为JSON字符串,实现Java工具与JSON数组之间的转换。代码如下所示:
java
复制代码
import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; / @author 逐一哥Sun / public class Demo03 { public static void main(String[] args) { try { //创建一个凑集 Map<String,List<Person>> map=new HashMap<>(); List<Person> list=new ArrayList<>(); Person p1=new Person(); p1.setName("逐一哥"); p1.setAge(20); p1.setAddress("山东"); Person p2=new Person(); p2.setName("壹哥"); p2.setAge(18); p2.setAddress("北京校区"); Person p3=new Person(); p3.setName("孙老师"); p3.setAge(30); p3.setAddress("青岛校区"); list.add(p1); list.add(p2); list.add(p3); map.put("persons", list); //创建一个ObjectMapper工具映射工具 ObjectMapper mapper = new ObjectMapper(); //序列化:将Java工具转为json字符串 String json = mapper.writeValueAsString(map); System.out.println("json="+json); } catch (JsonProcessingException e) { e.printStackTrace(); } } }
实行结果如下图所示:
4. 反序列化4.1 字符串转工具
而反序列化,便是将JSON字符串转换为Java工具的过程。我们来看看如下代码:
java
复制代码
import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; / @author 逐一哥Sun / public class Demo02 { public static void main(String[] args) { //先创建一个ObjectMapper工具映射工具 ObjectMapper mapper = new ObjectMapper(); //许可json字符串中有单引号,办理JsonParseException: //Unexpected character (''' (code 39)): was expecting double-quote to start field name mapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true); String jsonString = "{'name':'逐一哥','age':18,'address':'上海'}"; try { //反序列化:将JSON字符串转换为对应的Java工具 Person person = mapper.readValue(jsonString, Person.class); System.out.println(person.getName()+"--"+person.getAge()+"--"+person.getAddress()); } catch (JsonProcessingException e) { //处理json处理非常 e.printStackTrace(); } } }
实行结果如下图所示:
在上面的案例中,我们首先创建了一个ObjectMapper工具,然后利用readValue方法将JSON字符串转换为Person工具。Person类须要拥有对应的属性和getter/setter方法,末了输出了person工具的name和age等属性。
4.2 字符串转凑集除了可以将JSON字符串转为单个工具,我们也可以将一个繁芜的JSON字符串转为一个得当的凑集工具类型。
java
复制代码
import java.util.List; import java.util.Map; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; / @author 逐一哥Sun / public class Demo04 { public static void main(String[] args) { // 先创建一个ObjectMapper工具映射工具 ObjectMapper mapper = new ObjectMapper(); // 许可json字符串中有单引号,办理JsonParseException: // Unexpected character (''' (code 39)): was expecting double-quote to start // field name mapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true); String jsonString = "{'persons':[{'name':'逐一哥','age':20,'address':'上海校区'},{'name':'壹哥','age':18,'address':'北京校区'}]}"; try { // 反序列化:将JSON字符串转换为对应的Java工具 //直接将json字符串转为对应的Java工具 Persons persons = mapper.readValue(jsonString, Persons.class); List<Person> list = persons.getPersons(); for (Person person : list) { System.out.println(person.getName() + "--" + person.getAge() + "--" + person.getAddress()); } // 也可以直接将json字符串转为Map凑集 Map<String, Person> map = mapper.readValue(jsonString, Map.class); for (Map.Entry<String, Person> entry : map.entrySet()) { System.out.println(entry.toString()); } } catch (JsonProcessingException e) { // 处理json处理非常 e.printStackTrace(); } } }
实行结果如下图所示:
在上面的案例中,我们创建了一个Persons类,内部包含了一个包含Person工具的List列表。然后利用ObjectMapper工具将JSON字符串转换为Person工具,末了遍历PersonList中的每个Person工具,输出其属性值。这个案例中,JSON字符串中的name、age和address属性,分别对应了Person类中的name、age和address属性。
我们便是通过以上这几种办法,实现了Java工具与JSON字符串之间的转换,你学会了吗?
5. 把稳事变我们在进行JSON解析时,须要把稳以下几个问题:
JSON字符串必须是有效的JSON格式,否则会导致解析失落败; Java类中的属性的名称和类型,必须与JSON工具或JSON数组中的键和值相对应; JSON字符串中的键必须是字符串类型,用双引号包裹; Java类中的属性类型必须与JSON字符串中的值类型相对应; 利用Jackson进行JSON解析时,须要将JSON字符串的Unicode转义符进行转义,例如将"\"转换为"\\"; JSON字符串中的键必须是唯一的,重复的键会被覆盖; JSON字符串中的数组必须利用中括号包裹,并利用逗号分隔数组元素。
以上这些把稳事变,大家一定要负责对待,否则可能会导致你涌现一些莫名其妙的缺点哦。
------------------------------正片已结束,来根事后烟----------------------------
四. 结语壹哥在本文给大家详细先容了JSON解析的观点、事理和利用方法,并以Jackson为例进行了详细的实现。壹哥希望大家闇练节制JSON解析,由于这个技能实在是太常用了哦。在实际开拓中,我们要根据实际需求选择得当的JSON解析办法,并根据详细的情形选择相应的表明,以便让JSON解析更加得便捷和高效。