发表于: 2017-07-26 20:03:21

1 4593


今天学习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来进行反序列化的。

两个方法结果一样。

—————————————————————————————————————————————————————————

明天:学习分页查询的实现。


问题:无。


总结:瞎学中。



返回列表 返回列表
评论

    分享到