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

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

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

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

但是当我尝试调用此方法时,spring 提示说: 无法将类型“java.lang.String”的值转换为所需类型“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);
    }

有什么想法吗?我是否正在尝试做一些不受支持的事情?

最佳答案

您的参数应该是 @RequestParam @RequestBody,而不是两者。

@RequestBody 用于 POST 和 PUT 请求,其中请求的主体是您要解析的内容。 @RequestParam 用于命名参数,可以在 URL 上或作为多部分表单提交。

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

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

https://stackoverflow.com/questions/3921736/

相关文章:

xml - Chrome 开发者工具响应/预览选项卡 "Pretty Print"或 "Format

python - 无法解析 JSON 文件中的 TAB

javascript - 如何向(JSON)对象的原型(prototype)添加方法?

java - Jackson JSON序列化,通过级别定义避免递归

c# - 将 .NET Dictionary 序列化为 JSON 键

json - Jackson Scala 模块的小例子?

asp.net-mvc - ASP.NET MVC - 将 Json 结果与 ViewResult

c# - Tuple 如何从 JSON 序列化和反序列化?

c# - 返回 HttpResponseMessage 的 Web API 最佳方法

php - 无法安装 Composer - 缺少 json 扩展名