目录
一、JSON概念
二、常用类型
三、基本使用
四、@JsonIgnore&@JsonIgnoreProperties()
五、 解决JSON日期格式化问题:@JsonFormat
一、JSON概念
JSON(JavaScript Object Notation, JS对象简谱)是一种轻量级的数据交换格式。它基于 ECMAScript(European Computer Manufacturers Association, 欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率
二、常用类型
任何支持的类型都可以通过 JSON 来表示,例如字符串、数字、对象、数组等。但是对象和数组是比较特殊且常用的两种类型。
对象:对象在 JS 中是使用花括号包裹 {} 起来的内容,数据结构为 {key1:value1, key2:value2, ...} 的键值对结构。在面向对象的语言中,key 为对象的属性,value 为对应的值。键名可以使用整数和字符串来表示。值的类型可以是任意类型。
数组:数组在 JS 中是方括号 [] 包裹起来的内容,数据结构为 ["java", "javascript", "vb", ...] 的索引结构。在 JS 中,数组是一种比较特殊的数据类型,它也可以像对象那样使用键值对,但还是索引使用得多。同样,值的类型可以是任意类型。
三、基本使用
3.1 添加jackson相关依赖
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.9.3</version>
</dependency>
3.2 在spring-mvc.xml文件添加如下内容
<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>
3.3 注解介绍:
注解-@ResponseBody:将Controller方法的返回结果直接写入到 response对象的 body中,通常用来返回JSON数据或者XML数据。需要注意的是,使用此注解之后,Controller方法的返回值不会再走视图解析器,而是直接写到输出流中,
添加位置:
添加在方法上:只对当前方法起作用。
添加在类上:对该类里面的所有方法都起作用。
注解-@RestController:等同于@Controller和@ResponseBody;
添加位置:只能添加在类上面,该类里面的所有方法返回的都是JSON数据。
3.4 在请求处理方法中添加@ResponseBody注解,将返回结果直接转换成JSON
@RequestMapping("/loadFwxxToJson")
@ResponseBody
public Fwxx loadFwxxToJson(@ModelAttribute Fwxx fwxx) {
...
}
注:此请求处理方法返回的已经不是视图了
3.5 测试方法:
Book实体类型:通过书本id查询单个书本方法,返回单个书本对象;
List<Book>类型:分页查询(模糊)书本方法,返回Book类型的List集合;
List<Map<String,Object>>类型:查询所有书本方法,返回Map类型的List集合;
返回混合类型;
定义方法
List<Book> queryPager(Book book);Book querySingleBook(Integer bookId);@MapKey("bookId")List<Map<String,Object>> queryAllListMap();
编写sql
<select id="queryPager" resultType="com.zking.ssm.model.Book">select <include refid="baseSql"/> from tb_book where true<if test="null != bookName and '' != bookName">and book_name like concat('%',#{bookName},'%')</if>order by book_id desc
</select>
<select id="querySingleBook" resultType="com.zking.ssm.model.Book">select <include refid="baseSql"/>from tb_book where book_id = #{bookId}
</select>
<select id="queryAllListMap" resultType="java.util.Map">select <include refid="baseSql"/>from tb_book
</select>
controller层
@Controller
//@RestController//==@Component + @ResponseBody
@RequestMapping("/book")
public class BookController {@Autowiredpublic IBookService bookService;@RequestMapping("/toPage/{page}")public String toPage(@PathVariable String page){return page;}@ResponseBody //将数据结果转换成json@RequestMapping("/queryPager")public List<Book> queryPager(Book book,HttpServletRequest request){PageBean pageBean = new PageBean();pageBean.setRequest(request);return bookService.queryPager(book,pageBean);}@ResponseBody@RequestMapping("/querySingleBook/{bookId}")public Book querySingleBook(@PathVariable Integer bookId){return bookService.querySingleBook(bookId);}@ResponseBody@RequestMapping("/queryAllListMap")public List<Map<String,Object>> queryAllListMap(){return bookService.queryAllListMap();}//混合模式:返回分页查询的总数据量和数据集合。@ResponseBody@RequestMapping("/queryPager1")public Map<String,Object> queryPager1(Book book,HttpServletRequest request){PageBean pageBean = new PageBean();pageBean.setRequest(request);//获取数据集合List<Book> bookList = bookService.queryPager(book, pageBean);//获取总数据量Integer total = pageBean.getTotal();//定义map集合Map<String,Object> jsonMap = new HashMap<>();jsonMap.put("bookList",bookList);jsonMap.put("total",total);return jsonMap;}//@ResponseBody //不走视图解析器,直接返回JSON字符串@RequestMapping("/toIndex")public String toIndex(){return "index";}
}
前端页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ include file="/static/comment/head.jsp"%>
<html>
<head><title>Title</title>
</head>
<body><ol><li><a href="${path}/book/queryPager">分页查询-queryPager-返回List<Book></a></li><li><a href="${path}/book/querySingleBook/1">查询单个-querySingleBook-返回Book</a></li><li><a href="${path}/book/queryAllListMap">查询所有-queryAllListMap-返回List<Map<String,Object>></a></li><li><a href="${path}/book/queryPager1">混合模式-queryPager1-返回Map<String,Object></a></li></ol>
</body>
</html>
测试打印的数据是json格式
四、@JsonIgnore&@JsonIgnoreProperties()
@JsonIgnore:此注解用于属性或者方法上(最好是属性上),用来完全忽略被注解的字段和方法对应的属性,即便这个字段或方法可以被自动检测到或者还有其他的注解,一般标记在属性或者方法上,返回的json数据即不包含该属性。
@JsonIgnore // 忽略该字段private String bookName;
@JsonIgnoreProperties():一般标记在属性或者方法上,返回的json数据即不包含该属性
@JsonIgnoreProperties({"bookName","bookPrice"})
public class Book {private Integer bookId;private String bookName;private Float bookPrice;
}
五、 解决JSON日期格式化问题:@JsonFormat
@JsonFormat(pattern = "yyyy-MM-dd HH:mi:ss",timezone="GMT+8")private Date creataDate;