SpringMvc返回json类型数据有以下几种方式(个人都使用过):
1、在方法上使用@ResponseBody注解
需要引入jackson依赖包。
com.fasterxml.jackson.core
jackson-databind
2.4.4
com.fasterxml.jackson.core
jackson-core
2.4.4
com.fasterxml.jackson.core
jackson-annotations
2.4.4
2、直接在控制器方法中使用HttpServletResponse reponse 直接打印json格式数据
3、ModelAndView返回json。(重点说明)
【1】自定义实现:
(1)自定义一个ModelView中的View类。该View继承org.springframework.web.servlet.view.AbstractView抽象类,并重写renderMergedOutputModel方法。
(2)改变ModelAndView中的View。通过构造函数参数或者调用setView方法,将自定义View传入即可。
代码实现如下:
<1>继承org.springframework.web.servlet.view.AbstractView抽象类,重写renderMergedOutputModel方法。
import com.alibaba.fastjson.JSONObject;
import org.springframework.web.servlet.view.AbstractView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayOutputStream;
import java.io.OutputStream;
import java.util.Map;
/**
* 重写视图
* @author 陈嘉豪
*/
public class MyView extends AbstractView {
@Override
protected void renderMergedOutputModel(Map map, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
//转json
JSONObject jsonObject = new JSONObject();
jsonObject.putAll(map);
ByteArrayOutputStream bas = new ByteArrayOutputStream();
bas.write(jsonObject.toJSONString().getBytes("utf-8"));
httpServletResponse.setContentType("application/json;charset=UTF-8");
httpServletResponse.setContentLength(bas.size());
OutputStream os = httpServletResponse.getOutputStream();
bas.writeTo(os);
os.flush();
}
}
<2>将自定义的View设置到ModelAndView中的View。
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author 陈嘉豪
*/
@Controller
@RequestMapping("cjh")
public class MyController {
@RequestMapping("toJson")
public ModelAndView toJson(){
List list = Arrays.asList("陈嘉豪","32fjadjfi24mk3mk4m3k2a");
return toJson(list);
}
private ModelAndView toJson(Object res){
ModelAndView modelAndView = new ModelAndView(new MyView());
Map data = new HashMap<>();
data.put("success",true);
data.put("message","成功");
data.put("res",res);
modelAndView.addAllObjects(data);
return modelAndView;
}
}
返回数据效果:
{"res":["陈嘉豪","32fjadjfi24mk3mk4m3k2a"],"success":true,"message":"成功"}
完成以上就可实现该效果了。第三种方式中ModelAndView即可以返回到一个页面,也可以返回json数据。更好的统一编码规范。
【2】直接使用Spring提供的org.springframework.web.servlet.view.json.MappingJackson2JsonView,自己查看了该类 的源码,同样该类集成了AbstractView,该View和上面自定义View作用相同,这样我们可以不用自己实现了。
更多>>>自己网上还了解到一种实现方式,同样是MappingJackson2JsonView,参考如下:
上面的ContentNegotiationManager 只用了两个解析策略,首先根据请求的 urlpath 的后缀(例如 /***/*.json,后缀为json,该请求的mediatype为 application/json)来匹配mediatype,若找不到,则使用 http 协议请求头Accept字段判断请求的 mediatype。
InternalResourceViewResolver 用来渲染jsp视图,MappingJackson2JsonView 用来解析json请求就行。
只要你把访问的地址加上 .json 后缀,或者把 请求头 Accept 设置成 application/json (可直接使用jquery的$.getJson()) 就能匹配到默认视图MappingJackson2JsonView 。
同样的,只要你把访问的地址加上 .html 后缀,或者把 请求头 Accept 设置成 text/html 就可以匹配到InternalResourceViewResolver 视图解析器。
ContentNegotiationManager 还可以可以自定义url 后缀 和 mediatype的对应关系,Accept 头 和 mediatype的对应关系等等,但是 ContentNegotiationManager 字段的作用不仅仅是这些。