2017-01-10 9 views
1

私は春のブートプロジェクトでjsonを読み込もうとしています。springboot deserializeできません - HttpMessageNotReadableException

次のように私のJSONデータがある:

[{ 
    "userId":"101" 
}, 
{ 
    "partNum":"aaa" 
}, 
{ 
    "partNum":"bbb" 
}, 
{ 
    "partNum":"ccc" 
}] 

私はDTOクラスを作成しました:

public class TcPartDto { 
    private String userId; 
    private List<String> partNum; 

    public String getUserId() { 
     return userId; 
    } 
    public void setUserId(String userId) { 
     this.userId = userId; 
    } 
    public List<String> getPartNum() { 
     return partNum; 
    } 
} 

を、次のように私は私のコントローラでそれを呼び出しています:

@RequestMapping(value = "/volumeinfo", method = RequestMethod.POST, consumes = {"application/json"}, produces = {"application/json"}) 
@ResponseBody 
public List<TcPartVolumeDto> volumeinfo(@RequestBody TcPartDto partList) throws Exception { 
    return tcService.fetchVolumeInfo(partList); 
} 

しかし、次のエラーが表示されます。

ポストマンを通して、私はこのエラーを取得する:

"Could not read document: Can not deserialize instance of tc.service.model.TcPartDto out of START_ARRAY token\n at [Source: [email protected]; line: 1, column: 1]; nested exception is com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of tc.service.model.TcPartDto out of START_ARRAY token\n at [Source: [email protected]; line: 1, column: 1]"

私がやっている何が問題

答えて

0

作成したDTOは読みしようとしているJSONデータと一致していませんが。あなたのDTOサンプルJSONに基づいて

は次のようになります。

{ 
    "userId" : "someId", 
    "partNum" : [ "partNum1", "partNum2"] 
} 

あなたが消費しているJSONオブジェクトが固定されている場合はそうでない場合、その後DTOは次のようになります。

public class MyDTO { 

    private String userId; 
    private String partNum; 

    // ... 
} 

とのパラメータを使用してコントローラとタイプ

List<MyDTO> 
+0

これは私のために働きます!ありがとう –

0

public List<TcPartVolumeDto> volumeinfo(@RequestBody TcPartDto partList)メソッドにJSON配列を送信しています。しかし、単一のオブジェクトに逆直列化する必要があります:TcPartDto partList

は、単一の TcPartDtoを送信したり、あなた volumeinfo方法は Arrayまたは Listを受信できることを確認するためにあなたのJSONの構造を変更し

そして、あなたは、単一のオブジェクトに送信したい場合には、あなたのJSONの構造を変更する必要があります。

{ 
    "userId": 101, 
    "partNum": [ 
    "aaa", 
    "bbb", 
    "ccc" 
    ] 
} 
+0

私はJSON形式を変更することはできません。別のアプリケーションから生成され、そのまま使用する必要があります –

0

他にも様々な回答が既に指摘されています。

場合には、これはあなたがクラスを変更せずにマップするJSONの場合:

JSON:

[{ 
    "userId":"101" 
}, 
{ 
    "partNum":"aaa" 
}, 
{ 
    "partNum":"bbb" 
}, 
{ 
    "partNum":"ccc" 
}] 

クラス:

@JsonIgnoreProperties(ignoreUnknown=true) 
public class TcPartDto { 

    private String userId; 
    private List<String> partNum; 
//getters and setters 
} 

コントローラー:

@RequestMapping(value = "/volumeinfo", method = RequestMethod.POST, consumes = {"application/json"}, produces = {"application/json"}) 
@ResponseBody 
public List<TcPartVolumeDto> volumeinfo(@RequestBody TcPartDto[] partArray) throws Exception { 
    return tcService.fetchVolumeInfo(partArray); 
} 

出力:

[{"userId":"101","partNum":null},{"userId":null,"partNum":["aaa"]},{"userId":null,"partNum":["bbb"]},{"userId":null,"partNum":["ccc"]}] 
関連する問題