1.1 简介
1.1.1 概述
JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。它基于 ECMAScript (欧洲计算机协会制定的 js 规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
1.1.2 JSON 的结构
① “名称/值”对的集合(A collection of name/value pairs)。不同的语言中,它被理解为对象(object),纪录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组 (associative array)。
② 值的有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array)。
1.2 JSON 的形式
1.2.1 对象
对象是一个无序的"键值对"集合。一个对象以 {
左括号开始,}
右括号结束。每个“名称”后跟一个 :
冒号 ;"键值对"之间使用 ,
逗号分隔。
{
"student":{
"name":"张三",
"age":"23"
}
}
1.2.2 数组
数组是值(value)的有序集合。一个数组以 [
左中括号开始, ]
右中括号结束。值之间使用 ,
逗号 分隔。
{
"array":[
"001",
"002",
"003"
]
}
1.2.3 值
值(value)可以是双引号括起来的字符串(string)、数值(number)、true、false、 null、对象(object)或者数组(array)。这些结构可以嵌套。
1.2.4 字符串
字符串(string)是由双引号包围的任意数量 Unicode 字符的集合,使用反斜线转义。一个字符(character)即一个单独的字符串(character string)。
1.2.5 数值
数值(number)也与 C 语言或者 Java 的数值非常相似。除去未曾使用的八进制与十六进制格式。除去一些编码细节。
1.2.6 空白
空白可以加入到任何符号之间。
1.3 Java 中的 JSON
Java 中并没有内置 JSON 的解析,因此使用 JSON 需要借助第三方类库。下面是几个常用的 JSON 解析类库:
FastJson
:阿里巴巴开发的 JSON 库,性能十分优秀。
Jackson
:社区十分活跃且更新速度很快。
1.3.1 FastJson
FastJson 是一个 Java 语言编写的高性能功能完善的 JSON 库。它采用一种“假定有序快速匹配”的算法,把 JSON Parse 的性能提升到极致,是目前 Java 语言中最快的 JSON 库。FastJson 接口简单易用,已经被广泛使用在缓存序列化、协议交互、Web 输出、Android 客户端等多种应用场景。
☞ 导包
<!-- 中央仓库下载 jar -->
http://repo1.maven.org/maven2/com/alibaba/fastjson/
<!-- maven -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>x.x.x</version>
</dependency>
☞ 创建 JSON 对象
// 创建 JSON 对象
JSONObject jsonObject = new JSONObject();
jsonObject.put("AGE", 10);
jsonObject.put("NAME", "张三");
jsonObject.put("DATE OF BIRTH", "2000/12/12 12:12:12");
☞ 转换方法
方法 | 描述 |
---|---|
static final Object parse(String text) | 把 JSON 文本解析为J SONObject 或者 JSONArray |
static final JSONObject parseObject(String text) | 把 JSON 文本解析成 JSONObject |
static final T parseObject(String text, Class clazz) | 把 JSON 文本解析为 JavaBean |
static final JSONArray parseArray(String text) | 把 JSON 文本解析成 JSONArray |
static final List parseArray(String text, Class clazz) | 把 JSON 文本解析成 JavaBean 集合 |
static final String toJSONString(Object object) | 将 JavaBean 序列化为 JSON文本 |
static final String toJSONString(Object object, boolean prettyFormat) | 将 JavaBean 序列化为带格式的 JSON 文本 |
static final Object toJSON(Object javaObject) | 将 JavaBean 转换为 JSONObject 或者 JSONArray |
☞ @JSONField 注解
属性 | 说明 |
---|---|
name | 用在成员变量不仅定义了输入 key 的名称,同时也定义了输出的名称。若为作用在 set/get 方法上,反序列化时不会赋值给属性 |
format | 用在 Date 类型的字段来格式化时间格式 |
serialize、deserialize | 布尔类型, 在序列化的时候就不包含这个字段了 |
serialzeFeatures | fastjson 默认的序列化规则是当字段的值为 null 的时候,是不会序列化这个字段 |
1.3.2 Jackson
Jackson 是当前用的比较广泛的,用来序列化和反序列化 json 的 Java 的开源框架。Jackson 社 区相对比较活跃,更新速度也比较快,Spring MVC 的默认 json 解析器便是 Jackson。 Jackson 优点很多。 Jackson 所依赖的 jar 包较少 ,简单易用。与其他 Java 的 json 的框架相比, Jackson 解析大的 json 文件速度比较快;Jackson 运行时占用内存比较低,性能比较好;Jackson 有灵活的 API,可以很容易进行扩展和定制。
☞ 导包
jackson-core
核心包,提供基于"流模式"解析的相关 API,它包括 JsonPaser 和 JsonGenerator。 Jackson 内部实现正是通过高性能的流模式 API 的 JsonGenerator 和 JsonParser 来生成和解析 json。
jackson-annotations
注解包,提供标准注解功能;
jackson-databind
数据绑定包, 提供基于"对象绑定" 解析的相关 API (ObjectMapper) 和"树模型" 解析的相关 API(JsonNode);基于"对象绑定" 解析的 API 和"树模型"解析的 API 依赖基于"流模式"解析的 API。
<!--
jackson-databind 依赖 jackson-core 和 jackson-annotations
当添加 jackson-databind 之后,依赖的 jar 也随之添加到 Java 项目工程中。
-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>x.x.x</version>
</dependency>
☞ Java 对象与 JSON 字符串互转
// Java 对象
Person person = new Person();
person.setName("张三");
person.setAge(23);
// 创建 ObjectMapper 对象
ObjectMapper mapper = new ObjectMapper();
/* Java 对象转 JSON 字符串
writeValue(): 将对象转成字符串,并且存入文件中;
writeValueAsString(): 将对象转成字符串返回;
*/
String jsonString = mapper.writeValueAsString(person);
/* JSON 字符串转 Java 对象
readValue( json对象, 预转换class): 将 JONS 字符串转为指定 Java 对象
*/
Person jsonPerson = mapper.readValue(jsonString, Person.class);
☞ 注解
注解 | 描述 |
---|---|
@JsonIgnore | 作用在属性或方法,用来告诉 Jackson 在处理时忽略该注解标注的 java pojo 属性 |
@JsonIgnoreProperties | 作用在类,@JsonIgnoreProperties 和 @JsonIgnore的作用相同,都是告诉 Jackson 该忽略哪些属性,不同之处是 @JsonIgnoreProperties 是类级别的,并且可以同时指定多个属性 |
@JsonIgnoreType | 标注在类上,当其他类引用该类时,该属性将被忽略 |
@JsonInclude | JsonInclude.Include.NON_EMPTY:属性为空或者 null 都不参与序列化。 JsonInclude.Include.NON_NULL:属性为 null 不参与序列化 |
@JsonProperty | 属性使用的注解,用来表示外部属性名字,就是使用别名序列化,而不是对象的名字。value: 指你需要指定的名字 |
@JsonFormat | 实体类/属性使用的注解,在序列化或者反序列化的时候,指定属性格式化日期/时间 |
1.3.3 一些对象的 JSON 字符串格式
☞ JavaBean
{"name":"张三","age":23,"gender":"男"}
☞ List
[
{"name":"张三","age":23,"gender":"男"},
{"name":"张三","age":23,"gender":"男"},
{"name":"张三","age":23,"gender":"男"}
]
☞ Map
{
"stu1":{"name":"张三","age":23,"gender":"男"},
"stu2":{"name":"张三","age":23,"gender":"男"},
"stu3":{"name":"张三","age":23,"gender":"男"}
}
1.4 web 中的 JSON
1.4.1 获取数据
☞ 单个数据
json对象.键名;
json对象["键名"];
☞ 遍历
for(var key in json对象) {
// TODO
}
1.4.2 JS 内置方法
方法 | 说明 |
---|---|
JSON.parse(jsonStr) | 用于将一个 JSON 字符串转换为 JavaScript 对象 |
JSON.stringify(jsonObj) | 用于将 JavaScript 值转换为 JSON 字符串 |