Создание объекта JSON Pojo для строки json

У меня есть сценарий, подобный этому, в котором необходимо преобразовать в объект с помощью 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);

Любое исключение?

eL_ 30.10.2018 07:22

Вы пробовали JSON.parse ()ссылка

brandt.codes 30.10.2018 07:24

Да, проблема в том, что я создал один объект, который напрямую сопоставляет строку json с объектом. Но в некоторых сценариях OrderDispatchItemDTO может быть одним объектом или несколькими объектами. Таким образом, в Java POJO я могу сделать это как LIST <OrderDispatchItemDTO> или OrderDispatchItemDTO. теперь предположим, что я сохранил его как LIST, а в строковых тегах json есть OrderDispatchItemDTO, тогда он будет работать нормально. но если есть один тег. он потерпит неудачу

divyanayan 30.10.2018 07:27

ошибка: вызвана: com.fasterxml.jackson.databind.exc.MismatchedInputException: невозможно десериализовать экземпляр java.util.ArrayList из токена START_OBJECT

divyanayan 30.10.2018 07:55

ваш второй JSON недействителен. Поскольку поле Details содержит 2 свойства с тем же именем OrderDispatchItemDTO

Hossein Nasr 30.10.2018 08:28
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
5
87
1

Ответы 1

Вы можете использовать атрибут @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.

divyanayan 30.10.2018 08:58

Другие вопросы по теме