2017-01-10 2 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

вы создали не совпадают с данными JSON он пытается читать DTO.

На основе вашего DTO образца JSON должен быть:

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

иначе, если объект JSON вы потребляя фиксировано, то DTO должно быть:

public class MyDTO { 

    private String userId; 
    private String partNum; 

    // ... 
} 

и с контроллером с параметром тип

List<MyDTO> 
+0

Это работает для меня! благодаря –

0

Вы отправляете массив JSON в ваш метод public List<TcPartVolumeDto> volumeinfo(@RequestBody TcPartDto partList). Но он должен быть десериализован для одного объекта: TcPartDto partList.

Измените структуру JSON, чтобы отправить только один TcPartDto или убедитесь, что ваш, который может получить ваш метод volumeinfoArray или List.

И вы должны изменить свою структуру 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"]}]