json字符串传到后台变成空
导读:最近在开发项目中,遇到了一个神奇的问题:前端将一个json字符串传到后台,但是后台接收到的却是一个空对象。经过排查和调试,发现了问题所在。// 前端代码var data = {"name": "Emma", "age": 18};$.aja...
最近在开发项目中,遇到了一个神奇的问题:前端将一个json字符串传到后台,但是后台接收到的却是一个空对象。经过排查和调试,发现了问题所在。
// 前端代码var data = { "name": "Emma", "age": 18} ; $.ajax({ url: "/api/user-info", type: "POST", data: JSON.stringify(data), contentType: "application/json; charset=utf-8", success: function() { // do something } } ); // 后台Java代码@RequestMapping(value = "/api/user-info", method = RequestMethod.POST, produces = "application/json; charset=utf-8")@ResponseBodypublic Map getUserInfo(@RequestBody UserInfo userInfo) { // do something return resultMap; } // UserInfo类public class UserInfo { private String name; private int age; //getters and setters}
在前端看来,这段代码是没有问题的,但是后台却接收到了一个空对象。经过分析,发现前端将data使用JSON.stringify()方法转成了json字符串,但是后台的@RequestBody注解将json字符串转成了UserInfo对象。问题在于UserInfo对象的属性与json字符串的键名一一对应,而在这个例子中,键名是带有双引号的字符串,而UserInfo的属性并没有双引号,导致了转换失败。
解决方法有两种:
1. 修改前端代码,将json对象直接传到后台:
var data = { "name": "Emma", "age": 18} ; $.ajax({ url: "/api/user-info", type: "POST", data: data, success: function() { // do something } } );
2. 修改后台代码,使用JsonNode解析json字符串:
@RequestMapping(value = "/api/user-info", method = RequestMethod.POST, produces = "application/json; charset=utf-8")@ResponseBodypublic Map getUserInfo(@RequestBody JsonNode jsonNode) { UserInfo userInfo = new UserInfo(); userInfo.setName(jsonNode.get("name").asText()); userInfo.setAge(jsonNode.get("age").asInt()); // do something return resultMap; }
经过以上修改,问题得到了解决。当在后台接收json字符串时,一定要注意键名和属性名的对应关系。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: json字符串传到后台变成空
本文地址: https://pptw.com/jishu/514442.html