web-dev-qa-db-ja.com

jsonをJavaオブジェクトに解析する

@Controllerアノテーションを使用して@ResponseBodyメソッドからjsonを返す方法に精通しています。

今、私は自分のコントローラーにいくつかのjson引数を読み取ろうとしていますが、まだ運がありません。これが私のコントローラーの署名です。

@RequestMapping(value = "/ajax/search/sync")
public ModelAndView sync(@RequestParam("json") @RequestBody SearchRequest json) {

しかし、このメソッドを呼び出そうとすると、springは次のように文句を言います:Failed to convert value of type 'Java.lang.String' to required type 'com.foo.SearchRequest'

@RequestBody注釈を削除しても違いはないようです。

Jsonの手動解析は機能するため、Jacksonはクラスパスに含まれている必要があります。

// This works
@RequestMapping(value = "/ajax/search/sync")
public ModelAndView sync(@RequestParam("json") String json) {
    SearchRequest request;
    try {
        request = objectMapper.readValue(json, SearchRequest.class);
    } catch (IOException e) {
        throw new IllegalArgumentException("Couldn't parse json into a search request", e);
    }

何か案は?サポートされていないことをしようとしていますか?

29
oksayt

クライアント側でjqueryを使用している場合、これは私のために働いた:

Java:

@RequestMapping(value = "/ajax/search/sync") 
public ModelAndView sync(@RequestBody SearchRequest json) {

Jquery(JSON.stringify関数を使用するには、Douglas Crockfordのjson2.jsを含める必要があります):

$.ajax({
    type: "post",
    url: "sync", //your valid url
    contentType: "application/json", //this is required for spring 3 - ajax to work (at least for me)
    data: JSON.stringify(jsonobject), //json object or array of json objects
    success: function(result) {
        //do nothing
    },
    error: function(){
        alert('failure');
    }
});
4