У меня есть сценарий, подобный этому, в котором необходимо преобразовать в объект с помощью Object mapper. Поэтому я создаю свойство, как показано ниже, для захвата OrderDispatchItemDTO.
@JsonProperty("OrderDispatchItemDTO")
private OrderDispatchItemDTO orderDispatchItemsDTO;
{
"Message": {
"MessageData": {
"OrderDispatchDTO": {
"StartDateTime": "2017-05-19T02:45:00",
"Details": {
"OrderDispatchItemDTO": {
more json properties
}
},
"EndDateTime": "2017-05-19T05:45:00",
}
},
"StatusID": 1,
}
}
Но если OrderDispatchItemDTO поступает в виде списка, тогда мой картограф не работает, поскольку он не может проанализировать строку json
@JsonProperty("OrderDispatchItemDTO")
private List<OrderDispatchItemDTO> orderDispatchItemsDTO;
{
"Message": {
"MessageData": {
"OrderDispatchDTO": {
"StartDateTime": "2017-05-19T02:45:00",
"Details": [
"OrderDispatchItemDTO": {
more json properties
},
"OrderDispatchItemDTO": {
more json properties
}
],
"EndDateTime": "2017-05-19T05:45:00",
}
},
"StatusID": 1,
}
}
исправление - mapper.configure (DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);
Вы пробовали JSON.parse ()ссылка
Да, проблема в том, что я создал один объект, который напрямую сопоставляет строку json с объектом. Но в некоторых сценариях OrderDispatchItemDTO может быть одним объектом или несколькими объектами. Таким образом, в Java POJO я могу сделать это как LIST <OrderDispatchItemDTO> или OrderDispatchItemDTO. теперь предположим, что я сохранил его как LIST, а в строковых тегах json есть OrderDispatchItemDTO, тогда он будет работать нормально. но если есть один тег. он потерпит неудачу
ошибка: вызвана: com.fasterxml.jackson.databind.exc.MismatchedInputException: невозможно десериализовать экземпляр java.util.ArrayList из токена START_OBJECT
ваш второй JSON недействителен. Поскольку поле Details содержит 2 свойства с тем же именем OrderDispatchItemDTO




Вы можете использовать атрибут @JsonAnySetter и динамически настраивать список. Вот пример. В моем случае одно свойство может быть либо числом, либо объектом, поэтому вот как я решил это просто:
@JsonAnySetter
public void setAdditionalProperty(String name, Object value) {
try {
if (name.equals("property") && value != null) {
MyObject t = null;
if (value instanceof Long) {
t = new MyObject();
t.setId((Long) value);
} else if (value instanceof LinkedHashMap) {
t = mapper.convertValue(value, MyObject.class);
}
//putting t anywhere i.e. setting property
}
}
catch (Exception e) {
e.printStackTrace();
}
}
спасибо, что поделился ... моя проблема была решена с обновлением свойства mapper.
Любое исключение?