JAXB (MOXy) - немаршалинг нулевых значений

У меня проблемы с разборкой JSon с помощью JAXB MOXy.

Ниже приведен JSON, который я хочу проанализировать:

{
    "accounts": [{
        "description": "A",
        "balance": 1000,
        "balanceAvailable": 1000
    },
    {
        "description": "B",
        "balance": 1001,
        "balanceAvailable": 1001
    },
    {
        "description": "C",
        "balance": 1002,
        "balanceAvailable": 1002
    }],
    "cardPermissions": null,
    "totalBalanceAvailable": 1046.19
}

Проблема здесь с полем «cardPermissions».

Я пытаюсь демаршалировать объект, у которого нет поля «cardPermissions» (без аннотации @XmlElement и атрибута класса).

JAXB выдает исключение NullPointerException при демаршалинге этой строки, потому что это:

"cardPermissions": null

и не:

"cardPermissions": "null"

Чтобы принять нулевое значение, мне пришлось добавить в свой POJO поле cardPermissions (с аннотацией @XmlElement).

Выполняя это, также без геттеров и сеттеров, JAXB может правильно демаршалировать предоставленный JSON.

null и «null» - это совершенно разные вещи, но я не хочу включать это поле в свой POJO, и я должен игнорировать эти нулевые значения.

РЕДАКТИРОВАТЬ

Если я включу корневой элемент («customerInfo») следующим образом:

{
    "customerInfo": {
        "accounts": [{
            "description": "B",
            "balance": 1000,
            "balanceAvailable": 1000
        },
        {
            "description": "C",
            "balance": 1001,
            "balanceAvailable": 1001
        },
        {
            "description": "D",
            "balance": 1002,
            "balanceAvailable": 1002
        }],
        "cardPermissions": null,
        "totalBalanceAvailable": 1046.19
    }
}

JSON анализируется правильно, но я не хочу включать root, когда я демаршалю json.

Это мой POJO:

@XmlRootElement(name = "customerInfo")
@XmlAccessorType(XmlAccessType.FIELD)
public class CustomerInfo {

    @XmlElement(name = "name")
    private String firstName;

    @XmlElement(name = "surname")
    private String lastName;

    @XmlElement
    private String customerId;

    @XmlElement
    private String email;

    @XmlElement
    private String cardPermissions; //This field has no getter and setter. I need it in order to parse correctly the JSON without the root node "customerInfo"

    @XmlElement
    private List<Account> accounts;

    public CustomerInfo() {

    }

    public CustomerInfo(String firstName, String lastName, String emailAddress) {

        this.firstName = firstName;
        this.lastName = lastName;
        this.email = emailAddress;
    }

    public String getFullName() {

        return firstName + " " + lastName;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public List<Account> getAccounts() {
        return accounts;
    }

    public void setAccounts(List<Account> accounts) {
        this.accounts = accounts;
    }

    public String getCustomerId() {
        return customerId;
    }

    public void setCustomerId(String customerId) {
        this.customerId = customerId;
    }
}
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
315
1

Ответы 1

У вас есть два варианта:

  • Установите атрибут required на false в аннотации @XmlElement
  • Установите значение атрибута name в аннотации @XmlElement всех других полей, а затем удалите ненужное поле. При этом поле будет проигнорировано.

Для получения дополнительных и хороших подробностей перейдите к этому старому Почта.

Проблема здесь в том, что JAXB не игнорирует это конкретное значение, но это происходит, если я включаю корневой элемент в json (см. Редактирование :)

Lazarus 02.10.2018 15:19

Разместите свой POJO для получения более подробной информации.

Harry Coder 02.10.2018 16:20

Ваш файл json действителен, и ваше pojo тоже. Вместо конструктора с параметрами надо убрать. Вы делаете правильно, устанавливая корневой элемент. Почему вы хотите удалить корневой элемент?

Harry Coder 02.10.2018 17:45

Потому что вызываемая мной веб-служба возвращает такой ответ, и я не могу его изменить.

Lazarus 02.10.2018 18:32

Вы неправильно поняли то, что вы хотите. Не могли бы вы четко объяснить, что вы пытаетесь сделать? Я до сих пор не могу понять, какую модификацию вы хотите выполнить в JSON. Когда ваш JSON находится в вашем POJO, вы можете внести все необходимые изменения и снова преобразовать его в JSON.

Harry Coder 02.10.2018 23:01

Я просто хочу правильно его разобрать. Но при использовании JSON без корневого элемента или без добавления поля cardPermissions JAXB генерирует исключение нулевого указателя. Это исправляется так, как я сказал, но я не хочу добавлять корневой элемент, когда я неупорядочиваю, и я не хочу добавлять поле cardPermissions внутри моего POJO. Спасибо за помощь

Lazarus 03.10.2018 06:10

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