8.SpringMVC中json数据传输
8.1 什么是json?
- JSON (JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。
- 它基于 ECMAScript(欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
8.2 json与JavaScript关系
- JSON 是 JS 对象的字符串表示法,它使用文本表示一个 JS 对象的信息,本质是一个字符串。
- JSON 和 JS 对象互转
要实现从JSON字符串转换为JS对象,使用 JSON.parse() 方法:
var obj = JSON.parse('{"a": "Hello", "b": "World"}'); //结果是 {a: 'Hello', b: 'World'}
要实现从JS对象转换为JSON字符串,使用 JSON.stringify() 方法:
var json = JSON.stringify({a: 'Hello', b: 'World'}); //结果是 '{"a": "Hello", "b": "World"}'
- 任何支持的类型都可以通过 JSON 来表示,例如字符串、数字、对象、数组等。但是对象和数组是比较特殊且常用的两种类型。
- 表示对象
- 表示数组
-
{ "people":[ { "firstName": "Brett", "lastName":"McLaughlin" }, { "firstName":"Jason", "lastName":"Hunter" } ] } 这不难理解。在这个示例中,只有一个名为 people的变量,值是包含两个条目的数组,每个条目是一个人的记录,其中包含名和姓。上面的示例演示如何用括号将记录组合成一个值。当然,可以使用相同的语法表示更过多的值(每个值包含多个记录)。
8.3 Json转化器Jackson和FastJson
8.3.1 Jackson
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.11.1</version>
</dependency>
JSON转为Java对象
- 导入jackson的相关jar包(依赖)
- 创建Jackson核心对象 ObjectMapper ObjectMapper mapper = new ObjectMapper();
- 调用ObjectMapper的相关方法进行转换
readValue(json字符串数据,Class)
Java对象转换JSON
- 使用步骤:导入jackson的相关依赖
- 创建Jackson核心对象 ObjectMapper ObjectMapper mapper = new ObjectMapper();
- 调用ObjectMapper的相关方法进行转换 mapper.writeValue(response.getWriter(),map);
转换方法
writeValue(参数1,obj):
参数1:
File:将obj对象转换为JSON字符串,并保存到指定的文件中
Writer:将obj对象转换为JSON字符串,并将json数据填充到字符输出流中
OutputStream:将obj对象转换为JSON字符串,并将json数据填充到字节输出流中
writeValueAsString(obj):将对象转为json字符串
readValue(String json,Class aclass);将json字符串转为对象
8.3.2 FastJson
fastjson依赖
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.72</version>
</dependency>
测试代码
@RequestMapping("/xuan2")
public String testJson2(ServletResponse response) throws JsonProcessingException {
//json对象
User user1 = new User("郑楷",50,"女");
User user2= new User("黄文",20,"女");
User user3 = new User("杨深",80,"女");
User user4 = new User("沙嗲",3,"女");
User user5 = new User("郑楷",17,"女");
Map<Integer,User> map =new HashMap();
map.put(1,user1);
map.put(2,user2);
map.put(3,user3);
map.put(4,user4);
map.put(5,user5);
return JSON.toJSONString(map);
}
JSON方法
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHL9E1VZtWOsJGbahVWshmMMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL5QzN2UTO1kDMxIzNwAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
8.4 编写测试
第一步:编写controller层代码
- 这里的@[email protected][email protected]
package com.xuan.controller;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.xuan.pojo.User;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.ServletResponse;
@RestController
public class JsonController {
@RequestMapping("/xuan")
public String testJson(ServletResponse response) throws JsonProcessingException {
//json对象
ObjectMapper mapper = new ObjectMapper();
User user = new User();
user.setName("郑泽楷");
user.setAge(58);
user.setGender("女");
String string = mapper.writeValueAsString(user);
return string;
}
}
第二步:编写关键配置文件
- 下面是解决json乱码问题的关键配置
<!--json乱码问题配置-->
<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="true"/>
</bean>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
第三步:做测试根据自己的路径