一、JSON
JSON(JavaScript Object Notation, JS 对象标记)是一种轻量级的数据交换格式,目前使用特别广泛。
采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
在 js 语言中,一切都是对象,因此任何支持 JS 支持的类型都可以通过 JSON 来表示。他们的要求和语法格式有一下几条:
- 对象表示为键值对
- 数据由逗号分隔
- { } 花括号表示对象
- [ ] 方括号保存数组
JSON 键值对 是用来保存 JS 对象的一种方式,和JS 对象的写法也大同小异,格式为:{"属性名" : "值"}
{"name": "lixuechen"}
{"age" : "18"}
{"sex" : "男"}
我们可以把JSON 理解为是 JS 对象的字符串表示形式
var obj = {a: 'Hello', b: 'World'}; //这是一个对象,注意键名也是可以使用引号包裹的
var json = '{"a": "Hello", "b": "World"}'; //这是一个 JSON 字符串,本质是一个字符串
1、JSON 和 JS 对象互转
JSON 和 JS 互相转换,主要用到一下两个方法
方法 | 描述 |
---|---|
JSON.parse() | JSON字符串转换为JS对象 |
JSON.stringify() | JS对象转换为JSON字符串 |
格式如下:
var obj = JSON.parse('{"a": "Hello", "b": "World"}');
//结果是 {a: 'Hello', b: 'World'}
var json = JSON.stringify({a: 'Hello', b: 'World'});
//结果是 {"a": "Hello", "b": "World"}
使用实例进行测试一下,创建一个 html ,代码如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>JSON_十八</title>
</head>
<body>
<script type="text/javascript">
//编写一个js的对象
var user = {
name: "李十八",
age: 18,
sex: "男"
};
//将js对象转换成json字符串
var str = JSON.stringify(user);
console.log(str);
//将json字符串转换为js对象
var user2 = JSON.parse(str);
console.log(user2.age, user2.name, user2.sex);
</script>
</body>
</html>
然后使用浏览器打开这个 html 网页,摁 F12 去控制台看一下输出信息,运行结果如下:
2、使用 Controller 实现返回 JSON 数据
在这我们就需要 Jackson 工具对 json 进行解析,所有我们要导入 Jackson 的 jar 包
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.8</version>
</dependency>
然后写一个实体类,然后我们去编写我们的测试 Controller 。在这我们需要知道@ResponseBody
和ObjectMapper
对象 。
其中注解 @ResponseBody
就是把后台的对象转换成json对象,返回到页面;和它对应的有一个是@RequestBody
一般用来负责接收前台的json数据,把 json 数据自动封装到实体类中。
ObjectMapper 对象则是用来创建一个 jackson 的对象映射器,用来解析数据。有了这两个东西我们就能使用 Controller 实现返回 JSON 数据。
为了防止出现乱码,我们可以在 Spring 的配置文件中加入如下代码:
<mvc:annotation-driven>
<mvc:message-converters register-defaults="true">
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<constructor-arg value="UTF-8"/>
</bean>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="objectMapper">
<bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean">
<property name="failOnEmptyBeans" value="false"/>
</bean>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
Controllor 进行测试
package com.lxc.controller;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.lxc.pojo.User;
import com.lxc.utils.JsonuUtils;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
@Controller
public class UserContraller<controller> {
@RequestMapping("/json1")
@ResponseBody
public String json1() throws JsonProcessingException {
//创建 Jackson 的对象映射器,来解析数据
ObjectMapper objectMapper = new ObjectMapper();
User user = new User("李雪晨", 18, "男");
String str = objectMapper.writeValueAsString(user);
return str;
}
}
运行结果如下:
在测试方法中加入一个集合进行测试:
@RequestMapping("/json3")
@ResponseBody
public String json3() throws JsonProcessingException {
ObjectMapper mapper = new ObjectMapper();
List<User> list = new ArrayList<>();
User user1 = new User("李某人", 18, "男");
User user2 = new User("张三", 18, "男");
User user3 = new User("王五", 18, "男");
list.add(user1);
list.add(user2);
list.add(user3);
String str = mapper.writeValueAsString(list);
return str;
}
测试结果: