2017-01-10 5335 views
1

我想在我的spring引導項目中讀取json。springboot無法反序列化-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

您創建不匹配它試圖讀取JSON數據的DTO。

根據您的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

更改JSON結構只發送一個TcPartDto或確保您,您的volumeinfo方法可以接收ArrayList

而且你必須改變你的情況下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"]}]