Spring MVC,反序列化单个JSON?

时间:2012-01-20 18:27:57

标签: java json spring spring-mvc jackson

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

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

{"first":"A","second":"B"}

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

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

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

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

{"first":"A","second":"B"}

我知道我可以创建一个简单的bean类,它可以与@RequestMapping(value = "/path", method = RequestMethod.POST) public void handleRequest(@RequestParam("first") String first, @RequestParam("second") String second) { // ... } 注释结合使用,在使用时将同时包含@RequestBodyA,但它看起来像一个绕道而行,因为它们在网络应用程序中有不同的用途。

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

2 个答案:

答案 0 :(得分:5)

POJO

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

    //getters/setters
}

......然后:

public void handleRequest(@RequestBody Input input)

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

地图

public void handleRequest(@RequestBody Map<String, String> input)

答案 1 :(得分:3)

我编写了一个自定义WebArgumentResolver来完成此操作,并结合自定义注释。

我现在没有可用的源代码,但基本上我注释了我的方法:

@RequestMapping(value = "/path", method = RequestMethod.POST)
public void handleRequest(@JsonField("first") String first, @JsonField("second") String second) { 
    // ...
}

然后我的JsonFieldWebArgumentResolver检查方法参数是否用JsonField注释,如果是,它从参数中提取实际类型(如果你想处理的话,结果不是很直接通用参数,例如List<String>List<Pojo>),并手动调用Jackson的JsonParser来创建正确的类型。遗憾的是,我无法向您展示任何代码,但这就是它的要点。

但是,该解决方案适用于 Spring MVC 3.0 ,如果您使用 3.1 ,我认为您最好使用自定义而是HandlerMethodArgumentResolver。但这个想法应该是一样的。