Spring MVC,反序列化单个JSON?

mat*_*sev 7 java spring json spring-mvc jackson

如何轻松分离在同一请求中发送的JSON值?

鉴于我将JSON发布到我的服务器:

{"first":"A","second":"B"}
Run Code Online (Sandbox Code Playgroud)

如果我在Controller中实现以下方法:

@RequestMapping(value = "/path", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
public void handleRequest(@RequestBody String input) { 
    // ...
}
Run Code Online (Sandbox Code Playgroud)

那么该input参数将构成一个包含整个JSON对象的String {"first":"A","second":"B"}.我真正想要的是两个单独的字符串(或者一个字符串和一个适合特定请求的int),只有两个值(客户端可能发送的其他键/值对应该被忽略).

如果字符串是作为请求参数而不是JSON请求体发送的,那么它很简单:

@RequestMapping(value = "/path", method = RequestMethod.POST)
public void handleRequest(@RequestParam("first") String first, 
                          @RequestParam("second") String second) { 
    // ...
}
Run Code Online (Sandbox Code Playgroud)

我知道我可以创建一个简单的bean类,它可以与@RequestBody包含两者AB使用时的注释一起使用,但它似乎是一个绕道而行,因为它们在Web应用程序中有不同的用途.

依赖关系:org.springframework:spring-web:3.1.0.RELEASE org.codehaus.jackson:jackson-mapper-asl:1.9.3

Tom*_*icz 5

POJO

public class Input {
    private String first;
    private String second;

    //getters/setters
}
Run Code Online (Sandbox Code Playgroud)

...然后:

public void handleRequest(@RequestBody Input input)
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您需要在CLASSPATH上使用Jackson.

地图

public void handleRequest(@RequestBody Map<String, String> input)
Run Code Online (Sandbox Code Playgroud)

  • 我建议使用`JsonNode`作为中间类型而不是Map.没什么大不了的,只是更方便,更安全. (3认同)