Json作为客户端和服务器端数据交换的一种很重要的数据交换格式,应用非常广泛,那么如何在Spring MVC中处理Json(接收,转化,响应…)       文章目录     Json       导入依赖    使用@ResponseBody    @RestController    @RequestBody    Jackson常用注解         日期转化     属性忽略     属性名修改     null和empty属性排除     自定义序列化        Fastjson         导入依赖     安装FastJson     使用     常用注解             Json     Spring MVC默认使用的Json解决方案选择的是Jackson,所以只需要导入Jackson的依赖就可以使用了    导入依赖          <!-- Jackson -->        <dependency>            <groupId>com.fasterxml.jackson.core</groupId>            <artifactId>jackson-databind</artifactId>            <version>2.4.2</version>        </dependency>  使用@ResponseBody     这个注解的作用是将返回值自动转为json并返回给客户端       我们假定在处理业务时需要返回给客户端一个Employee的对象        @RequestMapping("test1")    @ResponseBody   //这个注解的作用是将返回值自动转为json并返回给客户端    public Employee test1(){        System.out.println("test1");        Employee employee = new Employee(1,"leiyu",true);        return employee;    }     注意方法返回值,renturn直接返回的是我们获取到的employee对象,,由SpringMVC自动为我们转化为json,需要添加@ResponseBody注解       小总结:当以后我们需要用到json数据时,只需要添加这个注解,并直接返回       @ResponseBody注解适合所有的对象类型,不论是实体,还是集合…等        @RequestMapping("test2")    @ResponseBody    public List<Employee> test2(){        System.out.println("test2 json转化复杂对象,或者说嵌套对象");        Employee employee = new Employee(1,"leiyu",true);        Employee employee1 = new Employee(1,"小白",false);        List<Employee> employeeList = Arrays.asList(employee,employee1);        return employeeList;    }     特例:@ResponseBody对字符串无转化效果       只有当返回值不是字符串时才会帮我们转化    如果是字符串类型,那么就会直接输出字符串的内容    观察这个示例,发现加了@ResponseBody注解之后,使用return返回的不再是一个页面,而是将字符直接响应给客户端           @RequestMapping("test3")    @ResponseBody    public String test3(){        System.out.println("注解对原本就是字符串的无转化,直接输出");        return "ok";//因为加了注解,这里不再转发到页面而是返回一个json字符串,而这个又是字符串类型,因为直接输出字符    }      //如果字符串是中文,那么要要设置字符集,不然会中文乱码    @RequestMapping(value = "test4",produces = "text/html;charset=utf-8")    @ResponseBody    public String test4(){        System.out.println("注解对原本就是字符串的无转化,直接输出");        return "ok";//因为加了注解,这里不再转发到页面而是返回一个json字符串,而这个又是字符串类型,因为直接输出    }     如果需要响应的字符串是中文,那么需要设置字符集 produces="text/html;charset=utf-8"   细心的读者发现我们之前在封装实体对象或者集合等类型时,虽然也有中文,但是不需要设置字符集,是因为在Jackson中已经为我们封装好了关于对象转化为json的字符集,而在字符串是直接响应,不再将字符串转化为json,也就没有封装字符集,需要我们自己封装.    @RestController     在@RestController中封装了@Controller注解,在类的上写@RestController一方面表示这个类是一个控制器类,另一方面,它会为该控制器中的所有handler都自动封装一个@ResponseBody注解,就意味着在该控制器中的每个handler都需要返回一个json格式的数据                在@RestController中封装了@Controller                             @RequestMapping("employee")@RestControllerpublic class EmployeeController {    @RequestMapping("test1")    //@ResponseBody 因为有了@RestController注解,在handler中就不需要在写这个注解    public Employee test1(){        System.out.println("test1");        Employee employee = new Employee(1,"leiyu",true);        return employee;    }}  @RequestBody     使用@RequestBody,接收Json参数    定义Handler  public class User {    private Integer id;    private String name;    private Boolean gender;    private Date birthday;}  定义去值方法      @RequestMapping("test2")    @ResponseBody    public String test2(@RequestBody User user){        System.out.println(user);        return "ok";    }  Ajax发送Json请求  <%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head>    <title>Json接收响应</title>    <script src="${pageContext.request.contextPath}/js/jquery-1.10.2.js"></script></head><body>    <input type="button" value="ajax" οnclick="send_json();">    <script>        function send_json() {            var  user = {id:1,name:"雷雨"};            var userJson = JSON.stringify(user);            $.ajax({                url:"${pageContext.request.contextPath}json/test2",                type:"post",                data:userJson,                contentType:"application/json",                success:function (ret) {                    alert(ret);                }            })        }    </script></body></html>  Jackson常用注解  日期转化     在日期转json时,默认使用的是日期的毫秒数   可阅读性不强,因为需要使用到日期的格式化   使用注解@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")       pattern的参数的时期格式化的格式    timezone表示的是日期的时区,我们在东八区因为加8       public class User {    private Integer id;    private String name;    private Boolean gender;    @JsonFormat(pattern = "yyyy-MMM-dd HH:mm:ss",timezone = "GMT+8")    private Date birthday;    ...    get/set}  属性忽略     @JsonIgnore   在实体类的属性上加这个注解,那么会在生成Json时忽略该属性    属性名修改     @JsonProperty(“new_name”)   在实体类的属性上加这个注解,那么会在生成Json时使用新的属性名作为Json格式的属性名    null和empty属性排除     Jackson默认输出null值的属性,如果不需要,可以排除       @JsonInclude(JsonInlude.Include.NON_NULL):表示null值 属性不输出    @JsonInclude(JsonInlude.Include.NON_EMPTY):empty属性不输出(空串,长度为0的集合,null值)       自定义序列化     @JsonSerialize(using= Myserializer.class) ,使用Myserializer输出某属性    Fastjson     如果不想使用Jackson,那么也可以使用FastJson,由于FastJson不是MVC的默认依赖方案,因此需要自己额外带入依赖和安装    导入依赖  <dependency>    <groupId>com.alibaba</groupId>    <artifactId>fastjson</artifactId>    <version>1.1.37</version></dependency>  安装FastJson      <mvc:annotation-driven>        <!--安装FstJson,转换器 -->        <mvc:message-converters>            <bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">                <property name="supportedMediaTypes">                    <list>                        <value>application/json</value>                    </list>                </property>            </bean>        </mvc:message-converters>    </mvc:annotation-driven>  使用     @ResponseBody @RequestBody @RestController使用方法不变    常用注解         日期格式化:@FSONField(format=“yyyy/MM/dd”)    属性名修改: @JSONField(name=“birth”)    属性忽略: @JSONField(serialize = false)    包含null值:@JSONField(serializeFeatures = SerillizeFeature.WriteMapNullValue) 默认忽略所有null值,有此注解会输出null           @JSONField(serialzeFeatures=SerializeFeature.WriteNullStringAsEmpty)          自定义序列化:@JSONField(serializeUsing = MySerializer2.class)           MySerializer2是我们写的自定义的序列化的类                我是雷雨,一个普本科的学生,主要专注于Java后端和大数据开发       如果这篇文章有帮助到你,希望你给我一个大大的赞 如果有什么问题,希望你能留言和我一起研究,学习靠自觉,分享靠自愿       转载注明出处 https://blog.csdn.net/qq_40742223  
点赞 0
评论 0
全部评论

相关推荐

06-05 19:46
已编辑
武汉大学 后端
点赞 评论 收藏
分享
07-31 14:17
门头沟学院 Java
牛客39712426...:那他今年招集贸呢,26届本科大部分不就是属猴,除非写明招25的或者研究生
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务