Привязка JSON к классу Java с использованием JAXB - PullRequest
0 голосов
/ 11 августа 2009

У меня есть следующий JSON, где может быть либо true, либо false:

{"flag1":<boolean value>, "flag2":<boolean value>}

И я попытался связать его с классом Java, используя Джерси и следующие аннотации JAXB:

@XmlRootElement
public class MyClass {
    @XmlElement(name = "flag1", type = Boolean.class)
    private Boolean flag1;
    @XmlElement(name = "flag2", type = Boolean.class)
    private Boolean flag2;

    ...
}

Проблема в том, что когда я присваиваю не булево значение «flag1» или «flag2», как в примере ниже, JAXB автоматически присваивает ложное значение полям «flag1» и «flag2» MyClass.

{"flag1":"foo", "flag2":"bar"}

Есть ли способ аннотировать 'MyClass', чтобы, когда JSON 'flag1' и 'flag2' не были логическими, я получал исключение?

Ответы [ 2 ]

2 голосов
/ 02 сентября 2010

То, что вы показали, сработало бы так, как вы хотите (исключение), если бы вы использовали чистый Jax-провайдер Jackson. Он принимает некоторые варианты (1 и 0, поскольку некоторые языки не имеют родного логического типа), но не вещи, которые не имеют значимого эквивалента.

В качестве альтернативы, как было предложено, метод сеттера с типом String будет иметь смысл, поскольку тогда вы можете вручную управлять преобразованиями.

2 голосов
/ 11 августа 2009

Похоже, что Джерси просто использует Boolean.valueOf , который обрабатывает все, кроме буквального "true", как ложное. Поскольку в JavaScript нет понятия типа переменной, это вполне допустимое поведение.

Сопоставление XML, для сравнения, основано на определении схемы, которое имеет очень специфическое понятие логических значений.


Не используя Джерси (или JAXB с 1.x дней), мне интересно, нужно ли вам аннотировать фактические переменные, или вы могли бы аннотировать сеттеры. Или, возможно, вы могли бы предоставить установщик, который берет String и анализирует его, вместо / вместе с установщиком, который принимает boolean.

...