最近在开发项目中,遇到了一个神奇的问题:前端将一个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") @ResponseBody public MapgetUserInfo(@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的属性并没有双引号,导致了转换失败。
解决方法有两种:
var data = {"name": "emma",data: data,success: function() { // do something } });
2. 修改后台代码,使用JsonNode解析json字符串:
@RequestMapping(value = "/api/user-info",produces = "application/json; charset=utf-8") @ResponseBody public MapgetUserInfo(@RequestBody JsonNode jsonNode) { UserInfo userInfo = new UserInfo(); userInfo.setName(jsonNode.get("name").asText()); userInfo.setAge(jsonNode.get("age").asInt()); // do something return resultMap; }
经过以上修改,问题得到了解决。当在后台接收json字符串时,一定要注意键名和属性名的对应关系。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。