1. JSON
1.1 什么是JSON
JSON(JavaScript Object Notation, JS 对象标记):是一种轻量级的数据交换格式。JSON使用JavaScript 语法来描述数据对象,采用完全独立于语言的文本格式,易于存储和交换。
JSON 的网络媒体类型是 application/json。
1.2 JSON使用范围
JSON基于JavaScript编写数据对象,因此,任何JavaScript支持的类型都可以通过JSON来表示。
JSON可以用于通过网络连接序列化和阐述结构化数据。
用于在Web应用程序之间传输数据。
1.3 JSON特点
- 采用完全独立于编程语言的文本格式来存储和表示数据。
- 简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。
- 易于人阅读和编写shiyo,同时也易于机器解析和生成,并有效地提升网络传输效率。
1.4 JSON格式
JSON语法是JavaScript语法的子集。
- 数据使用
key:value
对表示 - 数据间用逗号分隔
- 使用大括号保存对象
- 使用方括号保存数组,数组中包含多个对象
1.5 JSON示例
JSON数据的格式为:name:value
- JSON的
key
需要加引号,JavaScript不需要引号。 - JSON的
value
需要加引号,且为字符串
{ "name" : "JOEL" }
{ "fly" : false }
{ "money" : null }
1.6 JSON使用
使用场景:在后台应用程序中将响应数据封装为JSON格式,传到前台页面之后,需要将JSON格式转换为JavaScript对象,然后再页面中使用该数据。
2. JSON/JavaScript
在JavaScript中定义一个简答的对象:
<script type="text/javascript">
var user = {
name:"张三",
age:22,
sex:"男"
}
</script>
2.1 JSON与JS的区别
JSON 是 JS 对象的字符串表示法,它使用文本表示一个 JS 对象的信息,本质是一个字符串。
var obj = {a: 'Hello', b: 'World'}; //这是一个对象,注意键名也是可以使用引号包裹的
var json = '{"a": "Hello", "b": "World"}'; //这是一个 JSON 字符串,本质是一个字符串
2.2 JS转为JSON
要实现从JavaScript 对象转换为JSON字符串,使用 JSON.stringify()
方法:
// 将JavaScript对象转为JSON
var json = JSON.stringify(user);
document.write(json);
🔵 输出:{“name”:“张三”,“age”:22,“sex”:“男”}
2.3 JSON转为JS
要实现从JSON字符串转换为JavaScript 对象,使用 JSON.parse()
方法:
// 将JSON对象转为JavaScript
var js = JSON.parse(json);
document.write(js.name, js.age, js.sex);
🔵 输出:张三22男
2.4 JSON接口
JSON与JavaScript对象之间相互转换的方法定义在JSON接口中。
interface JSON {
/**
* 将JSON对象转为JavaScript
* @param JSON对象
* @param reviver转换结果的函数。该函数将为对象的每个成员调用。
* 如果成员包含嵌套对象,则嵌套对象在父对象之前进行转换。
*/
parse(text: string, reviver?: (this: any, key: string, value: any) => any): any;
/**
* 将JavaScript对象转为JSON
* @param value要转换的JavaScript值要转换的JavaScript值,通常是一个对象或数组。
* @param replacer转换结果的函数。
* @param 在返回值JSON文本中添加缩进、空格和换行符,使其更易于阅读。
*/
stringify(value: any, replacer?: (this: any, key: string, value: any) => any, space?: string | number): string;
/**
* 将JavaScript对象转为JSON
* @param value要转换的JavaScript值,通常是一个对象或数组。
* @param 一个字符串和数字的数组,作为一个被批准的列表,用于选择将被字符串化的对象属性。
* @param 在返回值JSON文本中添加缩进、空格和换行符,使其更易于阅读。
*/
stringify(value: any, replacer?: (number | string)[] | null, space?: string | number): string;
}
3. JSON解析工具
JSON 的解析工具:Jackson、Fastjson
3.1 Jackson
3.1.1 什么是Jackson
Jackson: 是当前用的比较广泛的,用来序列化和反序列化 json 的 Java 的开源框架。
3.1.2 Jackson核心
Jackson包含三部分:jackson-core、jackson-annotations、jackson-databind。
jackson-core: 核心包,提供基于"流模式"解析的相关 API,它包括 JsonPaser 和 JsonGenerator。 Jackson 内部实现正是通过高性能的流模式 API 的 JsonGenerator 和 JsonParser 来生成和解析 json;
jackson-annotations: 注解包,提供标准注解功能;
jackson-databind: 数据绑定包, 提供基于"对象绑定" 解析的相关 API ( ObjectMapper ) 和"树模型" 解析的相关 API (JsonNode);基于"对象绑定" 解析的 API 和"树模型"解析的 API 依赖基于"流模式"解析的 API。
3.1.3 ObjectMapper
Jackson 最常用的 API 就是基于"对象绑定" 的 ObjectMapper。
ObjectMapper 通过 writeValue 系列方法 将 java 对 象序列化 为 json,并 将 json 存 储成不同的格式,String(writeValueAsString),Byte Array(writeValueAsString),Writer, File,OutStream 和 DataOutput。
ObjectMapper 通过 readValue 系列方法从不同的数据源像 String , Byte Array, Reader,File,URL, InputStream 将 json 反序列化为 java 对象。
writeValueAsString
方法如下:
public String writeValueAsString(Object value) throws JsonProcessingException {
SegmentedStringWriter sw = new SegmentedStringWriter(this._jsonFactory._getBufferRecycler());
try {
this._writeValueAndClose(this.createGenerator((Writer)sw), value);
} catch (JsonProcessingException var4) {
throw var4;
} catch (IOException var5) {
throw JsonMappingException.fromUnexpectedIOE(var5);
}
return sw.getAndClear();
}
3.2 Fastjson
3.2.1 什么是Fastjson
fastjson是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean。
特点:速度快、使用广泛、测试完备、使用简单、功能完备。
3.2.2 Fastjson类
FastJson对于json格式字符串的解析主要用到了三个类:JSON、JSONObject、JSONArray。
- JSON:fastJson的解析器,用于JSON格式字符串与JSON对象及javaBean之间的转换。
- JSONObject:fastJson提供的json对象。
- JSONArray:fastJson提供json数组对象。
public abstract class JSON implements JSONStreamAware, JSONAware {...}
public class JSONObject extends JSON implements Map<String, Object>, Cloneable, Serializable, InvocationHandler {...}
public class JSONArray extends JSON implements List<Object>, Cloneable, RandomAccess, Serializable {...}
4. SpringMVC-JSON
4.1 Jackson方式
4.1.1 导入依赖
在pom.xml
导入jackson-databind
依赖。
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.0</version>
</dependency>
4.1.2 编写POJO
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private int id;
private String name;
private String password;
}
4.1.3 输出对象
4.1.3.1 编写Controller
解析步骤:
1️⃣ Step1:实例化ObjectMapper对象
2️⃣ Step2:实例化User对象
3️⃣ Step3:通过writeValueAsString方法将POJO解析为JOSN格式,返回String
@RestController
public class UserController {
//@ResponseBody
@RequestMapping(value = "/Json")
public String test() throws JsonProcessingException {
ObjectMapper objectMapper = new ObjectMapper();
User user = new User(1, "张三", "123123");
String str = objectMapper.writeValueAsString(user);
return str;
}
}
@RestController:这也是一种Controller,该注解表示不需要再走视图(View)
解释:之前Controller中的方法返回的都是String类型的视图名,而现在我们需要返回JSON,为了不修改视图解析器,我们可以将该注解作用在类上,这样就不再经过视图。
🌈 URL为@RequestMapping的value。
@ResponseBody:指示方法返回值的注释应该绑定到web响应主体上。支持带注释的处理程序方法。
该注解实现的就是不用再走视图。
🌈 @RestController注解实际上就是被@ResponseBody标注的!
4.1.3.1 测试输出
4.1.4 输出集合
4.1.4.1 编写Controller
@RestController
public class UserController {
@RequestMapping(value = "/JsonList")
public String test2() throws JsonProcessingException {
ObjectMapper objectMapper = new ObjectMapper();
User user = new User(1, "张三", "123123");
User user2 = new User(1, "李四", "123123");
List<User> list = new ArrayList<>();
list.add(user);
list.add(user2);
String str = objectMapper.writeValueAsString(list);
return str;
}
}
4.1.4.2 测试输出
4.1.5 输出日期
4.1.5.1 编写UTILS
思路:
1️⃣ Step1:实例化ObjectMapper对象
2️⃣ Step2:实例化SimpleDateFormat对象,传入日期格式
3️⃣ Step3:通过setDateFormat方法,为ObjectMapper对象指定格式
4️⃣ Step4:通过writeValueAsString方法将日期转为JSON数据并输出字符串
5️⃣ Step5:重载次方法,指定一个默认的日期格式
public class JsonDateUtils {
public static String getJsonDate(Object object){
return getJsonDate(object, "yyyy-MM-dd HH:mm:ss")
}
/**
* 格式化日期
* @param object 日期
* @param dateFormat 自定义日期格式
* @return 返回日期字符串
*/
public static String getJsonDate(Object object, String dateFormat) {
ObjectMapper objectMapper = new ObjectMapper();
SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
objectMapper.setDateFormat(sdf);
try {
return objectMapper.writeValueAsString(object);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
return null;
}
}
4.1.5.2 编写Conreoller
@RestController
public class UserController {
@RequestMapping("/JsonDate")
public String getDate(){
return JsonDateUtils.getJsonDate(new Date());
}
}
4.1.5.3 测试输出
4.2 Fastjson
4.2.1 导入依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.78</version>
</dependency>
4.2.2 编写测试类
public class FastJsonTest {
public static void main(String[] args) {
User user1 = new User(1,"张三","123123");
User user2 = new User(2,"李四","123123");
User user3 = new User(3,"王五","123123");
List<User> list = new ArrayList<>();
list.add(user1);
list.add(user2);
list.add(user3);
}
}
4.2.3.1 JAVA转JSON
System.out.println("===Java对象 转为 JSON字符串===");
System.out.println("userJSON: " + JSON.toJSONString(user1));
System.out.println("listJSON: " + JSON.toJSONString(list));
/*
输出:
===Java对象 转为 JSON字符串===
userJSON: {"id":1,"name":"张三","password":"123123"}
listJSON: [{"id":1,"name":"张三","password":"123123"},{"id":2,"name":"李四","password":"123123"},{"id":3,"name":"王五","password":"123123"}]
*/
4.2.3.2 JSON转JAVA
System.out.println("===JSON字符串 转为 Java对象===");
System.out.println("user: " + JSON.parseObject(JSON.toJSONString(user1), User.class));
System.out.println("list: " + JSON.parseObject(JSON.toJSONString(list), List.class));
/*
输出:
===JSON字符串 转为 Java对象===
user: User(id=1, name=张三, password=123123)
list: [{"password":"123123","name":"张三","id":1}, {"password":"123123","name":"李四","id":2}, {"password":"123123","name":"王五","id":3}]
*/
4.2.3 输出日期
利用Fastjson实现日期的输出,输出效果很上面用Jackson一致。
public static String getDate(Object object){
return getDate(object, JSON.DEFFAULT_DATE_FORMAT);
}
public static String getDate(Object object, String format){
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format);
return JSON.toJSONString(simpleDateFormat.format(object));
}
@Test
public void test(){
System.out.println(getDate(new Date()));
}
5. 写在最后
JSON常用的解析器还有Goole的gson,但是速度较慢。