Spring MVC,反序列化单个JSON?
如何轻松分离在同一请求中发送的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对象的String, {"first":"A","second":"B"}
。 我真正想要的是两个单独的字符串(或一个适合特定请求的字符串和一个int),只有两个值(客户端可能发送的其他键/值对应该被忽略)。
如果字符串是作为请求参数而不是JSON请求体发送的,那么它很简单:
@RequestMapping(value = "/path", method = RequestMethod.POST) public void handleRequest(@RequestParam("first") String first, @RequestParam("second") String second) { // ... }
我知道我可以创建一个简单的bean类,它可以与@RequestBody
注释一起使用,它将在使用时包含A
和B
,但它似乎是一个绕道而行,因为它们在Web应用程序中有不同的用途。
依赖关系:org.springframework:spring-web:3.1.0.RELEASE org.codehaus.jackson:jackson-mapper-asl:1.9.3
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 input)
我编写了一个自定义的WebArgumentResolver ,它与自定义注释相结合。
我现在没有可用的源代码,但基本上我注释了我的方法,如下所示:
@RequestMapping(value = "/path", method = RequestMethod.POST) public void handleRequest(@JsonField("first") String first, @JsonField("second") String second) { // ... }
然后我的JsonFieldWebArgumentResolver
检查方法参数是否用JsonField
注释,如果是,它从参数中提取实际类型(如果你想处理generics参数,例如List
,则结果不是很直接)或List
),并手动调用Jackson的JsonParser来创建正确的类型。 遗憾的是我无法向您展示任何代码,但这就是它的要点。
但是 ,该解决方案适用于Spring MVC 3.0 ,如果您使用3.1,我认为您最好使用自定义HandlerMethodArgumentResolver 。 但这个想法应该是一样的。