微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

json字符串传到后台变成空

最近在开发项目中,遇到了一个神奇的问题:前端将一个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 Map getUserInfo(@RequestBody UserInfo userInfo) {
    // do something
    return resultMap;
}

// UserInfo类
public class UserInfo {
    private String name;
    private int age;

    //getters and setters
}

json字符串传到后台变成空

在前端看来,这段代码是没有问题的,但是后台却接收到了一个空对象。经过分析,发现前端将data使用JSON.stringify()方法转成了json字符串,但是后台的@RequestBody注解将json字符串转成了UserInfo对象。问题在于UserInfo对象的属性与json字符串的键名一一对应,而在这个例子中,键名是带有双引号的字符串,而UserInfo的属性并没有双引号,导致了转换失败。

解决方法有两种:

1. 修改前端代码,将json对象直接传到后台

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 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字符串时,一定要注意键名和属性名的对应关系。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐