《 Spring学习笔记-MVC》系列文章,讲解返回json数据的文章共有3篇,分别为:

  1. 【Spring学习笔记-MVC-3】SpringMVC返回Json数据-方式1: 
  2. 【Spring学习笔记-MVC-4】返回Json数据-方式2: 
  3. 【Spring学习笔记-MVC-3.1】SpringMVC返回Json数据-方式1-扩展: 

文章的内容主要如下:

  1. 方式1:讲解如果返回单个对象的json;==>使用@ResponseBody来实现;注解方式
  2. 方式2:讲解如果返回多个对象的json;==>使用MappingJacksonJsonView来实现;xml配置方式
  3. 方式1-扩展:讲解如果返回多个对象的json;==>使用@ResponseBody来实现;注解方式

@ResponseBody方式来实现json数据的返回比较方便,推荐使用。

在《【Spring学习笔记-MVC-3】返回Json数据-方式1》中介绍了通过:

  1.  @ResponseBody声明返回值;
  2. 配置<mvc:annotation-driven />;

来返回json数据。效果如下:

spring返回时让jackson不改变我的属性名 spring返回json对象_spring

  ==>

spring返回时让jackson不改变我的属性名 spring返回json对象_mvc_02

从上面的效果看,只能返回一个对象,不能返回多个对象,不能做到形如下图的返回结果,

spring返回时让jackson不改变我的属性名 spring返回json对象_json_03

存在局限性(可能可以返回多个,自己不知道如何实现)。

下面介绍的方式2,利用spring mvc返回json数据,可以实现同时返回多个对象的json数据

特别说明:

使用@ResponseBody可以实现同样的效果,实现同时返回多个对象的Json数据,而且使用@  ResponseBody方式更简洁。具体请参考《 【Spring学习笔记-MVC-4】返回Json数据-方式1-kuozh 》。

参考链接:  

spring mvc实现json数据返回


具体步骤:

  1. 引入额外jar包:;
  2. 使用bean视图解析器: org.springframework.web.servlet.view.BeanNameViewResolver;
  3. 使用 org.springframework.web.servlet.view.json.MappingJacksonJsonView配置需要返回的对象;
  4. 声明:<mvc:annotation-driven />;   经测试,不添加这个声明,将出错;

说明:

spring mvc默认的最常用的视图解析器为 org.springframework.web.servlet.view.InternalResourceViewResolver ,

spring返回时让jackson不改变我的属性名 spring返回json对象_mvc_04

它的优先级默认是最低的,spring mvc还提供了许多其他类型的视图解析器,比如bean视图解析器

spring返回时让jackson不改变我的属性名 spring返回json对象_测试_05

等,每个视图解析器的优先级都是可以手动设置的。在进行视图解析时,按照视图解析器优先级的顺序去解析视图,直到有视图解析器可以进行解析,解析过程就停止。

项目结构


spring返回时让jackson不改变我的属性名 spring返回json对象_spring_06

配置web.xml


spring返回时让jackson不改变我的属性名 spring返回json对象_mvc_07


<web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee  http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <display-name>Spring Web MVC Application</display-name> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <servlet> <servlet-name>mvc-dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>mvc-dispatcher</servlet-name> <url-pattern>/rest/*</url-pattern> </servlet-mapping></web-app>


配置mvc-dispatcher-servlet.xml


spring返回时让jackson不改变我的属性名 spring返回json对象_测试_08

spring返回时让jackson不改变我的属性名 spring返回json对象_java_09

spring返回时让jackson不改变我的属性名 spring返回json对象_mvc_10

spring返回时让jackson不改变我的属性名 spring返回json对象_测试_11

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context"  xmlns:p="http://www.springframework.org/schema/p"  xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans  http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context  http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"> <context:component-scan base-package="com.ll.controller" /> <mvc:annotation-driven />  <!-- bean视图解析器 --> <bean class="org.springframework.web.servlet.view.BeanNameViewResolver" p:order="10" />  <!-- XMl及JSON视图解析器配置 --> <!-- <bean id="userListJson" class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" p:renderedAttributes="userList" /> -->  <bean id="userListJson" class="org.springframework.web.servlet.view.json.MappingJacksonJsonView"> <property name="renderedAttributes"> <set> <value>userList</value> <value>School</value> <value>Work</value> </set> </property> </bean></beans>

说明:

如果仅仅返回一个对象的json数据,可以使用简写配置:

spring返回时让jackson不改变我的属性名 spring返回json对象_spring_12


JSONController.java


spring返回时让jackson不改变我的属性名 spring返回json对象_java_13

执行过程解析


1. 在mvc-dispatcher-servlet.xml文件中我们配置了bean视图解析器,并设置器优先级为10,

spring返回时让jackson不改变我的属性名 spring返回json对象_测试_14

它的优先级是高于

spring返回时让jackson不改变我的属性名 spring返回json对象_java_15

; serListJson ,

spring返回时让jackson不改变我的属性名 spring返回json对象_mvc_16

u serListJson 对应的bean为:userListJson,其对应的视图为: MappingJacksonJsonView;

spring返回时让jackson不改变我的属性名 spring返回json对象_测试_17

这样,便将userlist、School和work转化为json数据,并返回前台。

运行


浏览器:  http://localhost:8080/SpringMVCQs/rest/kfc/brands/showUserListByJson 

spring返回时让jackson不改变我的属性名 spring返回json对象_测试_18

完整程序


JSONController.java   
    package com.ll.controller;import java.util.ArrayList;import java.util.List;import org.springframework.stereotype.Controller;import org.springframework.ui.ModelMap;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.ResponseBody;import com.ll.model.Person;import com.ll.model.Shop;@Controller@RequestMapping("/kfc/brands")public class JSONController {  @RequestMapping(value="/getShopInJson", method = RequestMethod.GET) public @ResponseBody Shop getShopInJSON() { System.out.println("-----请求json数据--------"); Shop shop = new Shop(); shop.setName("zhangsan"); shop.setStaffName(new String[]{"mkyong1", "mkyong2"});  return shop; }  @RequestMapping(value = "/showUserListByJson") public String showUserListInJson(ModelMap mm) { List<Person> userList = new ArrayList<Person>();  Person user1 = new Person(); user1.setUsername("tom"); user1.setPasswd("汤姆");  Person user2 = new Person(); user2.setUsername("john"); user2.setPasswd("约翰");  userList.add(user1); userList.add(user2);  mm.addAttribute("userList", userList); mm.addAttribute("School","SuZhou"); mm.addAttribute("Work","YanFa");  return "userListJson"; }}