簡體   English   中英

Spring MVC,反序列化單個JSON?

[英]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注釋一起使用,它將在使用時包含AB ,但它似乎是一個繞道而行,因為它們在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<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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM