Почему Gson может сериализовать / десериализовать, но объектная карта Джексона не работает

У меня есть строка ниже Json, и я хочу десериализовать то же самое, используя некоторый инструмент objectMapper, например Jackson. Но это выбрасывает исключение

Unrecognized field "CPREQUESTS" (Class mmt.jacoco.Respon), not marked as ignorable

Использовали множество соглашений об именах в классе Pojo для именования камер данных. тоже использовал @JsonProperty("CPREQUESTS"). Все, что я могу понять, это то, что мне нужно использовать какое-то соглашение об именах при сериализации-десериализации того же самого, но не в состоянии решить то же самое.

Это нормально работает с Gson, но jackon терпит неудачу

public class APItesting {

    public static void main(String[] args) throws JsonParseException, JsonMappingException, IOException {

          String res  = "{\r\n  \"CPREQUESTS\": [\r\n    {\r\n      \"a\": \"b\"\r\n    },\r\n    "
                            + "{\r\n      \"a\": \"d\"\r\n    }\r\n  ],\r\n  \"costAmount\": 10488\r\n}";

          Gson g = new Gson();
          Respon s = g.fromJson(res, Respon.class);
          System.out.println(s.getCPREQUESTS().get(0).getA());
          System.out.println(s.getCPREQUESTS().get(1).getA());
          System.out.println(s.getCostAmount());
          System.out.println(s.getCPREQUESTS().size());

          ObjectMapper om = new ObjectMapper();
          Respon s1 = om.readValue(res, Respon.class);
          System.out.println(s1.getCPREQUESTS().size());
    }
}

Respon.class выглядит следующим образом: -

public class Respon {


    private List<CPREQUESTS> CPREQUESTS = null;

    @JsonProperty("costAmount")
    private Integer costAmount;

    @JsonProperty("CPREQUESTS")
    public List<CPREQUESTS> getCPREQUESTS() {
        return CPREQUESTS;
    }

    @JsonProperty("CPREQUESTS")
    public void setCPREQUESTS(List<CPREQUESTS> cPREQUESTS) {
        this.CPREQUESTS = cPREQUESTS;
    }

    @JsonProperty("costAmount")
    public Integer getCostAmount() {
        return costAmount;
    }

    @JsonProperty("costAmount")
    public void setCostAmount(Integer costAmount) {
        this.costAmount = costAmount;
    }         
}

какой Джексон вы используете, я проверил, и он работает. Кажется, в вашем проекте есть обе версии jackson. Убедитесь, что JsonProperty и ObjectMapper должны быть из одной библиотеки jackson, либо из codehaus (jackson 1), либо из fastxml (jackson 2).

Pratapi Hemant Patel 04.06.2018 10:17

С GSON это работает, потому что gson использует отражение для получения имени поля, тогда как Джексон использует сеттер / получатель (по умолчанию) для сериализации / десериализации.

Pratapi Hemant Patel 04.06.2018 10:19

Джексон (очевидно) также использует отражение

Sharon Ben Asher 04.06.2018 10:29

Спасибо @HemantPatel за вашу помощь. Моя проблема заключалась в том, что в одном файле я использовал Jackson1, а в другом - импорт jackson 2, который вызывает проблему.

Karan 04.06.2018 10:52
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
4
1 007
1

Ответы 1

Кажется, в вашем проекте есть две разные версии jackson. Убедитесь, что ваш импорт для JsonProperty и ObjectMapper взят из одной библиотеки jackson, либо из codehaus (jackson 1), либо из fastxml (jackson 2).

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