Java SpringMVC,反序列化单个JSON?

Java SpringMVC,反序列化单个JSON?,java,json,spring,spring-mvc,jackson,Java,Json,Spring,Spring Mvc,Jackson,如何轻松地分离在同一请求中发送的JSON值 假设我将JSON发布到我的服务器: {"first":"A","second":"B"} 如果我在控制器中实现以下方法: @RequestMapping(value = "/path", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE) public void handleRequest(@RequestBody String input) {

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

假设我将JSON发布到我的服务器:

{"first":"A","second":"B"}
如果我在控制器中实现以下方法:

@RequestMapping(value = "/path", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
public void handleRequest(@RequestBody String input) { 
    // ...
}
然后,
输入
参数将与整个JSON对象构成一个字符串,
{“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:springweb:3.1.0.RELEASE org.codehaus.jackson:jackson mapper asl:1.9.3

POJO …然后:

public void handleRequest(@RequestBody Input input)
在这种情况下,您需要在类路径上可用

地图
public void handleRequest(@RequestBody-Map-input)
我已经编写了一个定制,它与一个定制注释结合在一起,正好实现了这一点

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

@RequestMapping(value = "/path", method = RequestMethod.POST)
public void handleRequest(@JsonField("first") String first, @JsonField("second") String second) { 
    // ...
}
然后,我的
jsonfieldwargumentresolver
检查方法参数是否用
JsonField
注释,如果是,则从参数中提取实际类型(如果您还想处理泛型参数,例如
List
List
),这不是很直接的结果,并手动调用Jackson的JsonParser来创建正确的类型。很遗憾,我不能向您展示任何代码,但这就是它的要点


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

POJO对应于我建议的bean类解决方案(我应该在问题中写出来)。Map可能是一个可行的解决方案……我建议使用
JsonNode
作为中间类型,而不是Map。没什么大不了的,只是更方便、更安全。
JsonNode
看起来很有趣,特别是如果需要将输入转换为字符串以外的其他类型,或者如果JSON结构比一级键/值映射更复杂,那么如果有两个扩展超类型的子类型类呢?我假设您不能将父类放入requestmapping方法参数中。像您的
@JsonField
这样的注释非常适合解决我的问题。我特别喜欢让它通用化的想法,但我必须仔细阅读这个主题以及@StaxMan评论的
JsonNode
API。然而,客户机目前发布的是非常简单的键/值字符串,因此我很难激发额外的成本。我一定会记住这个建议。
public void handleRequest(@RequestBody Map<String, String> input)
@RequestMapping(value = "/path", method = RequestMethod.POST)
public void handleRequest(@JsonField("first") String first, @JsonField("second") String second) { 
    // ...
}