今天学习JSON。
JSON缩写代表:JavaScript 对象表示法(JavaScript Object Notation)。
JSON 是存储和交换文本信息的语法。类似 XML。
JSON 比 XML 更小、更快,更易解析。
关于Unicode和UTF-8:
什么是Unicode:一种编码;为每一个字符而非字形定义唯一的代码(非字形);UTF-8中的UTF就是(Unicode Transformation Format),UTF-8的特点是对不同范围的字符使用不同长度的编码;
JSON使用Unicode的编码,JSON中一些特殊符号和控制符的编码:
JSON中的Boolean值(true false)和null不加引号。
JSON 还可以表示一个数组对象,使用 [] 包含所有元素,元素类型不限:
[“abc”,123,false,null]
对象在 JSON 中是用 {} 包含一系列无序的 Key-Value 键值对表示的,实际上此处的 Object 相当于 Java 中的 Map<String, Object>,而不是 Java 的 Class 。注意 Key 只能用 String 表示。
对象可以嵌套,例如:
1 2 3 | {"name":"Michael","address": {"city":"Beijing","street":" Chaoyang Road ","postcode":100025} } |
|
|
|
客户端如何处理JSON数据:看不懂JavaScript的代码。总之能直接将JSON 格式的数据字符串直接赋值给一个变量,使用xxx.name xxx.address.street 等方式直接获得对象中属性的值,数组的访问和Java一样,programmers[0]。
对象转为JSon:String newJSONtext = people.toJSONString();
不同的JavaScript框架对JSon还有更多的支持,以后如果学习前端可以再研究。
在做任务7时,导入第三方SDK(忘了哪一个)时需要一个gson包,所以顺便了解一下Google的这个gson包。
gson包特点:
1.使用toJson() 和 fromJson() 做到对象和JSON数据的转换
2.支持泛型
3.支持个性化表示对象
4.复杂的对象
使用方法:
新建Gson对象(或者用Bean)
Gson gson = new Gson();
对象转JSON:
String json = gson.toJson(obj);
JSON转对象:
BagOfPrimitives obj2 = gson.fromJson(json, BagOfPrimitives.class);
关于Java Serialization 序列化 和 transient 和 gson的关系 :
在类的成员变量中如果加入transient,这个变量就不会被序列化,在gson中也不会被转为JSON数据,所以gson的转换可以看做是序列化的一种,只不过转为了JSON字符串,而不是二进制码。
class GalleryImage implements Serializable
{
private Image image;
private transient Image thumbnailImage;
Java Serialization API有机会再看。
序列化时,空的成员变量会被略过。反序列化时,JSON中没有就把属性设为null;
—————————————————————————————————————————————————————————
任务中,曾经有一条是用JSON taglib标签,在MVC中返回JSON数据,当时没有用这个标签,今天重新做了这一条,使用了多种方法返回JSON数据,并且比较了之间的不同。
控制器四种方法:
//使用JSP返回JSON
@RequestMapping("/all/json1")
public String usersToJsonHandler1(Map<String, Object> map){
map.put("users", userService.getAllUsers());
return "userListJson";
}
//使用gson和@ResponseBody
@ResponseBody
@RequestMapping("/all/json2")
public String usersToJsonHandler2(HttpServletResponse response){
response.setHeader("Content-Type", "application/json;charset=utf-8");
return gson.toJson(userService.getAllUsers());
}
//使用Spring MVC的JSON视图
@RequestMapping("/all/json3")
public String userToJsonHandler3(Map<String, Object> map){
map.put("users", userService.getAllUsers());
return "userListJsonView";
}
//使用HttpMessageConverter和@ResponseBody
@ResponseBody
@RequestMapping("/all/json4")
public List<User> usersToJsonHandler4(){
return userService.getAllUsers();
}
JSP页面:
<%@ page import="com.zt1106.xiuzhen.task789.model.User" %>
<%@ page import="java.util.List" %>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" %>
<%@ taglib prefix="json" uri="http://www.atg.com/taglibs/json"; %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"; %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">;
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>User List</title>
</head>
<body>
<c:forEach items="${requestScope.users}" var="user">
<json:object>
<json:property name="name" value="${user.name}"/>
<json:property name="id" value="${user.id}"/>
<json:property name="qq" value="${user.qq}"/>
<json:property name="type" value="${user.type}"/>
<json:property name="school" value="${user.school}"/>
<json:property name="mentor" value="${user.mentor}"/>
<json:property name="link" value="${user.link}"/>
<json:property name="way" value="${user.way}"/>
<json:property name="username" value="${user.username}"/>
<json:property name="email" value="${user.email}"/>
<json:property name="phone" value="${user.phone}"/>
<json:property name="declaration" value="${user.declaration}"/>
<json:property name="registerTime" value="${user.registerTime}"/>
<json:property name="createAt" value="${user.createAt}"/>
<json:property name="updateAt" value="${user.updateAt}"/>
</json:object>
</c:forEach>
</body>
</html>
MVC中配置Bean视图解析器和一个视图Bean:
<bean class="org.springframework.web.servlet.view.BeanNameViewResolver">
<property name="order" value="0"/>
</bean>
<bean id="userListJsonView" class="org.springframework.web.servlet.view.json.MappingJackson2JsonView"/>
结果对比:
JSP中是对List中的对象进行遍历,生成JSON,其他自动生成的都是数组形式;暂时不知道怎么用taglib生成对象的数组;
用JSP返回的头信息显示的是:Content-Type →text/html;charset=utf-8不知道是不是个问题,因为复盘文档中要求,content-type都应该是application/json。
用gson的话需要自己改头信息,否则编码不是utf-8,类型不是JSON。
用MVC的JSON视图,生成的数组被放在了一个对象中,起名为“users”,不知道为什么。
2和4结果完全一样,都是一个User对象的数组形式。
方法4最简单,但是不能自己进行定制。
————————————————————————————————————————————————————————
在任务中,请求的参数都是请求参数的形式,没有做过请求是JSON数据的情况,看了一下书,大概知道了怎么处理请求体中的JSON数据,不知道对不对。
控制器:使用@RequestBody注解,把请求体当作JSON或String。
//使用HttpMessageConverter接受JSON
@RequestMapping("/testjson1")
public void testJsonHandler1(@RequestBody User user){
System.out.println(user);
}
//使用gson
@RequestMapping("/testjson2")
public void testJsonHandler2(@RequestBody String json){
User user = gson.fromJson(json, User.class);
System.out.println(user);
}
PostMan请求测试:

结果:第一种方法,如果请求type不是JSON,则会报415错误(第一次见这个错误),从侧面说明,控制器的入参类型虽然是POJO的类型,但是是通过请求的content-type来判断是否能有对应的HttpMessageConverter来进行反序列化的。

两个方法结果一样。

—————————————————————————————————————————————————————————
明天:学习分页查询的实现。
问题:无。
总结:瞎学中。
评论