在 spring-mvc 中将 json 解析为 java 对象

2022-09-01 11:48:20

我熟悉如何使用注释从我的方法返回json。@Controller@ResponseBody

现在,我正在尝试将一些json参数读取到我的控制器中,但到目前为止还没有运气。这是我的控制器的签名:

@RequestMapping(value = "/ajax/search/sync")
public ModelAndView sync(@RequestParam("json") @RequestBody SearchRequest json) {

但是当我尝试调用此方法时,spring抱怨说:Failed to convert value of type 'java.lang.String' to required type 'com.foo.SearchRequest'

删除批注似乎没有区别。@RequestBody

手动解析 json 工作正常,因此 Jackson 必须在类路径中:

// This works
@RequestMapping(value = "/ajax/search/sync")
public ModelAndView sync(@RequestParam("json") String json) {
    SearchRequest request;
    try {
        request = objectMapper.readValue(json, SearchRequest.class);
    } catch (IOException e) {
        throw new IllegalArgumentException("Couldn't parse json into a search request", e);
    }

有什么想法吗?我是否正在尝试执行不支持的操作?


答案 1

您的参数应为 或 或 ,而不是两者兼而有之。@RequestParam@RequestBody

@RequestBody用于 POST 和 PUT 请求,其中请求的正文是您要解析的内容。 用于命名参数,无论是在 URL 上还是作为多部分表单提交。@RequestParam

因此,您需要决定需要哪一个。你真的想把你的JSON作为请求参数吗?这通常不是 AJAX 的工作方式,它通常作为请求正文发送。

尝试删除,看看是否有效。如果没有,并且您确实将JSON作为请求参数发布,那么Spring将不会帮助您在没有额外管道的情况下处理它(请参阅自定义WebDataBinder初始化)。@RequestParam


答案 2

如果您在客户端使用jquery,这对我有用:

爪哇岛:

@RequestMapping(value = "/ajax/search/sync") 
public ModelAndView sync(@RequestBody SearchRequest json) {

Jquery(你需要包括Douglas Crockford的json2.js才能有JSON.stringify函数):

$.ajax({
    type: "post",
    url: "sync", //your valid url
    contentType: "application/json", //this is required for spring 3 - ajax to work (at least for me)
    data: JSON.stringify(jsonobject), //json object or array of json objects
    success: function(result) {
        //do nothing
    },
    error: function(){
        alert('failure');
    }
});