都是微服务的天下了,还有不知道 JSON 的程序员吗?

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 字符串



关注公众号一起学习 Java 开发,跟大家分享我的学习成长过程

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Demo_Null/article/details/106989174