都是微服务的天下了,还有不知道 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布尔类型, 在序列化的时候就不包含这个字段了
serialzeFeaturesfastjson 默认的序列化规则是当字段的值为 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标注在类上,当其他类引用该类时,该属性将被忽略
@JsonIncludeJsonInclude.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 开发,跟大家分享我的学习成长过程

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值