一、什么是JSON
- JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式,目前使用特别广泛。
- 采用完全独立于编程语言的文本格式来存储和表示数据。
- 简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。
- 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
在 JavaScript 语言中,一切都是对象。因此,任何JavaScript 支持的类型都可以通过 JSON 来表示,例如字符串、数字、对象、数组等。看看他的要求和语法格式:
- 对象:{'bid':1,'bname':'java入门到入土'}
- 数组:{1,2,3,4,5..}
- 混合:{'total':81,row:[{'bid':1,'bname':'java入门到入土'},{'bid':2,'bname':'php入门到入土'}...]}
二、SpringMVC中JSON的配置环境
1.在pom.xl中导入JSON依赖
<!--<json.version>2.9.3</json.version>-->
<!--jackson-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>${jackson.version}</version>
</dependency>
2.在spring核心控制器中配置JSON消息转换器
<!--但是,从spring3.1开始DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter的使用已经过时-->
<!--spring3.1开始我们应该用RequestMappingHandlerMapping来替换DefaultAnnotationHandlerMapping,-->
<!--spring3.1开始我们应该用用RequestMappingHandlerAdapter来替换AnnotationMethodHandlerAdapter-->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<property name="messageConverters">
<list>
<ref bean="mappingJackson2HttpMessageConverter"/>
</list>
</property>
</bean>
<bean id="mappingJackson2HttpMessageConverter"
class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<!--处理中文乱码以及避免IE执行AJAX时,返回JSON出现下载文件-->
<property name="supportedMediaTypes">
<list>
<value>text/html;charset=UTF-8</value>
<value>text/json;charset=UTF-8</value>
<value>application/json;charset=UTF-8</value>
</list>
</property>
</bean>
三、Controller返回多种类型的JSON数据
在请求处理方法中添加@ResponseBody注解,将返回结果直接转换成JSON
注:此请求处理方法返回的已经不是视图了
1.返回List<T>类型的JSON数据
/**
* 返回List<T>类型的Json数据
* @param book
* @param req
* @return
*/
@RequestMapping("/queryListBook")
@ResponseBody
public List<Book> queryListBook(Book book,HttpServletRequest req){
PageBean pageBean=new PageBean();
pageBean.setRequest(req);
List<Book> books=bookService.queryBookPager(book,pageBean);
return books;
}
2.返回Map类型的JSON数据
/**
* 返回Map类型的JSON数据
* @param bid
* @return
*/
@RequestMapping("/querySingleMap")
@ResponseBody
public Map<String,Object> querySingleMap(Integer bid){
return bookService.querySingleMap(bid);
}
3.返回List<Map<String,Object>>类型的JSON数据
/**
* 返回List<Map<>>类型的JSON数据
* @return
*/
@RequestMapping("/queryMapList")
@ResponseBody
public List<Map<String,Object>> queryMapList(){
return bookService.queryMapList();
}
4.返回对象类型的JSON数据
/**
* 返回对象类型的JSON数据
* @param bid
* @return
*/
@RequestMapping("/querySingleBook")
@ResponseBody
public Book querySingleBook(Integer bid){
Book book=bookService.selectByPrimaryKey(bid);
return book;
}
5.返回String类型的JSON数据
/**
* 返回String类型的Json数据
* @return
*/
@RequestMapping("/queryStr")
@ResponseBody
public String queryStr(){
return "book/bookList";
}
6.返回混合类型的JSON数据
/**
* 返回混合类型的Json数据
* @param book
* @param req
* @return
*/
@RequestMapping("/queryListBook1")
@ResponseBody
public Map<String,Object> queryListBook1(Book book,HttpServletRequest req){
PageBean pageBean=new PageBean();
pageBean.setRequest(req);
List<Book> books=bookService.queryBookPager(book,pageBean);
Map<String,Object> json=new HashMap<>();
json.put("total",pageBean.getTotal());
json.put("rows",books);
return json;
}
四、常用注解
1.@ResponseBody
作用:绕开视图解析器,将java对象转为json格式的数据。
- 不加@ResponseBody,是将方法返回的值作为视图名称,并自动匹配视图去显示
- 加上@ResponseBody就仅仅是将方法返回值当作内容直接返回到客户端,并且会自适应响应头的content-type,返回的字符串符合json
加上之后的content-type就是application/json
如果是普通字符串,就是text/plain
但是加上注解属性produces=application/json,那么不管内容是什么格式,响应头的content-type就一直是application/json,不再去做自适应,至于内容是不是json都不重要了
2.@JsonIgnore
作用:用来忽略某些字段,可以用在变量或者Get方法上,用在Set方法时,和变量效果一样。这个注解一般用在我们要忽略的字段上。
使用场景:springboot项目中定义了很多类,我们在rest返回中直接返回或者在返回对象中使用这些类,spring已经使用jackson自动帮我们完成这些的to json。但是有时候自动转的json内容太多,或者格式不符合我们的期望,因此需要调整类的to json过程,或者说希望自定义类的json过程。
3.@JsonFormat
作用:帮我们完成格式转换
例如对于Date类型字段,如果不适用JsonFormat默认在rest返回的是long,如果我们使用@JsonFormat(timezone = “GMT+8”, pattern = “yyyy-MM-dd HH:mm:ss”),就返回"2018-11-16 22:58:15"
4.@JsonProperty
作用:在返回实体类的JSON数据格式时,给此字段取别名 只在返回实体类时有效
本文参考链接:https://blog.csdn.net/weixin_57504000/article/details/124071694