![](/img/trans.png)
[英]How to deserialize json to a complicated object by using spring mvc?
[英]Spring MVC, deserialize single 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
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)
我編寫了一個自定義的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 。 但這個想法應該是一樣的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.