SpringMVC——JSON
一、什么是JSON
JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
那么到底什么是 JSON ?
JSON是一种取代XML的数据结构,和xml相比,它更小巧但描述能力却不差,由于它的小巧所以网络传输数据将减少更多流量从而加快速度。JSON就是一串字符串 只不过元素会使用特定的符号标注。
二、JSON语法
在JavaScript中,一切都是对象。因此任何数据类型都可以使用JSON来表示。
1.JSON语法:
- 对象表示为键值对形式
- 数据由逗号分开
- 花括号保存对象:{} 双括号表示对象
- 方括号保存数组:[] 中括号表示数组
- " " 双引号内是属性或值
- : 冒号后面是前面对象的值,如:{“name”: “张三”} 表示name的值为张三
2.JSON本质
JSON其实就是JavaScript对象的字符串表示法。本质上就是一个字符串。
//JS对象obj
var obj={name:'张三',age:18}
//JS对象的JSON形式
var jsonStr={"name":'张三',"age":"18"}
3.JSON 和 JS 对象互转
-
JSON.parse():JSON字符串转为JS对象
var jsonStr_obj = JSON.parse('{"name":"张三","age":"18"}'); console.log(jsonStr_obj)
如果要使用字符串对象要注意方法内部传入的一定要是字符传,属性必须用双引号,比如这样:
//JS对象的JSON形式 var jsonStr='{"name":"张三","age":18}'; //将JSON字符串转换为JS对象 var jsonStr_obj = JSON.parse(jsonStr+""); console.log(jsonStr_obj)
或者这样:
//JS对象的JSON形式 var jsonStr="{\"name\":\"张三\",\"age\":18}"; //将JSON字符串转换为JS对象 var jsonStr_obj = JSON.parse(jsonStr); console.log(jsonStr_obj)
-
JSON.stringify():JS对象转为JSON字符串
//JS对象 var obj={name:'张三',age:18} //将JS对象转为JSON字符串 var obj_json = JSON.stringify(obj); console.log(obj_json)
三、使用Controller实现返回JSON数据
导入Jackson解析的依赖包
我们要使用JSON就需要一个JSON的解析工具,Jackson就是一款比较好的JSON解析工具。
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.8</version>
</dependency>
编写实体类User
package com.muhan.pojo;
public class User {
private String name;
private int age;
//构造,get,set,toString
}
编写Controller
在编写Controller的的时候我们会用到一个注解@ResponseBody。那这个注解的作用到底是什么呢?
@ResponseBody是作用在方法上的,@ResponseBody 表示该方法的返回结果直接写入 HTTP response body 中,一般在异步获取数据时使用【也就是AJAX】,在使用 @RequestMapping后,返回值通常解析为跳转路径,但是加上 @ResponseBody 后返回结果不会被解析为跳转路径,而是直接写入 HTTP response body 中。 比如异步获取 json 数据,加上 @ResponseBody 后,会直接返回 json 数据。@RequestBody 将 HTTP 请求正文插入方法中,使用适合的 HttpMessageConverter 将请求体写入某个对象。我们还要知道@Controller+@ResponseBody=@RestController
package com.muhan.controller;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.muhan.pojo.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
@RestController
@Controller
public class TestJsonController {
@RequestMapping("jsonTest")
@ResponseBody//让返回的字符串不会解析成跳转路径,而是直接返回json数据
public String jsonTest() throws JsonProcessingException {
ObjectMapper mapper = new ObjectMapper();
User user = new User("张三", 18);
String string = mapper.writeValueAsString(user);
return string;
}
}
启动Tomcat测试
我们发现对象的json格式已经打印到页面上了,但是出现了乱码问题。下面偶们就来处理乱码问题
处理乱码问题
通过@RequestMapper的produces属性来处理乱码问题
@RequestMapping(value = "jsonTest",produces = "application/json;charset=utf-8")
测试
解决乱码问题高级做法
我们知道如果使用@RequestMapper注解的属性里面配置编码格式的话只会作用与这一个Controller,我们要想一劳永逸的解决乱码问题,就需要在配置文件中配置。我们在注解驱动中配置。
<!--注解驱动-->
<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>
测试:
解决日期格式问题
编写一个Controller
@Controller
public class TestJsonController {
@RequestMapping("/jsonTest")
@ResponseBody
public String jsonTest() throws JsonProcessingException {
ObjectMapper mapper = new ObjectMapper();
Date date = new Date();
String string = mapper.writeValueAsString(date);
return string;
}
}
测试:我们发现如果是日期格式就会编程一个数字
解决方案:取消timetamps形式,自定义时间格式
@Controller
public class TestJsonController {
@RequestMapping("/jsonTest")
@ResponseBody
public String jsonTest() throws JsonProcessingException {
ObjectMapper mapper = new ObjectMapper();
//取消timetamps形式
mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,false);
//自定义时间格式
mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
Date date = new Date();
String string = mapper.writeValueAsString(date);
return string;
}
}
测试:完美解决