Отобразить ноль для объектов -JSON- JAXB - PullRequest
4 голосов
/ 15 октября 2010

Я хочу маршалировать нулевые объекты как нулевые в представлении JSON. Но сейчас я не вижу элемента в JSON, если объект имеет значение null.

Example:
@XmlAccessType(FIELD)
@XmlType(name="foo" propOrder={"foo"}
class foo{
@XmlElement
      private Integer foo;
      private Integer another_foo;
..

getter()
setter()

}

В моем коде я устанавливаю для элемента foo значение null.

Но представление JSON не показывает элемент в ответе.

Ответ выглядит следующим образом

"foo" :{
 "another_foo":something
}

Я попытался установить атрибут элемента xml nillable true. (@XmlElement (nillable = истина)

Что делает ответ похожим,

"foo" :{
 "another_foo" : something
 "foo":{nil :true}
}

Я хочу, чтобы это было похоже,

    "foo" :{
     "another_foo":something
     "foo" : null
    }

Что я здесь не так делаю?

Ответы [ 3 ]

4 голосов
/ 15 октября 2010

Перво-наперво: JAXB НЕ выполняет JSON. Это XML API. Итак, вы, вероятно, используете фреймворк (мое предположение: реализация JAX-RS, как, может быть, Джерси)? Необходимо знать, какой из них вы используете для оказания дополнительной помощи.

Предполагается, что вопрос заключается в том, как пакет использует аннотации JAXB для управления сериализацией JSON. Некоторые в основном конвертируют объекты в XML (либо логическую структуру, либо полный XML), а затем конвертируют в JSON, используя соглашение. Это может привести к потере данных из-за различий в модели данных между XML и JSON.

Теперь: простое решение для большинства реализаций JAX-RS состоит в том, чтобы вообще не использовать подход, основанный на аннотациях JAXB, а специфичный для JSON сериализатор, такой как Jackson JacksonJsonProvider (Jackson может фактически использовать аннотации JAXB , тоже). По умолчанию он будет содержать нулевые значения для свойств, хотя это настраивается на случай, если вы хотите подавить нулевые значения.

Вот JavaDoc , который показывает, как использовать провайдера Джексона (укажите FEATURE_POJO_MAPPING для конфигурации) с Джерси, если это может помочь.

0 голосов
/ 11 апреля 2012

Примечание: Я EclipseLink JAXB (MOXy) лидер и член JAXB (JSR-222) экспертная группа.

EclipseLink JAXB (MOXy) предлагает встроенную поддержку JSON.Ниже приведен пример того, как аннотация @XmlElement может использоваться для сопоставления вашего варианта использования:

Foo

По умолчанию реализация JAXB не будет маршалировать нулевое свойство,Вы можете изменить это поведение, установив для свойства nillable для @XmlElement значение true.

package forum3938279;

import javax.xml.bind.annotation.*;

@XmlAccessorType(XmlAccessType.FIELD)
class Foo {
      @XmlElement(nillable=true)
      private Integer foo;
      private Integer another_foo;

}

jaxb.properties

Чтобы указать MOXy в качестве поставщика JAXBВы должны включить файл с именем jaxb.properties в тот же пакет, что и модель вашего домена, со следующей записью:

javax.xml.bind.context.factory = org.eclipse.persistence.jaxb.JAXBContextFactory

Демо

package forum3938279;

import javax.xml.bind.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Foo.class);

        Foo foo = new Foo();

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.setProperty("eclipselink.media-type", "application/json");
        marshaller.marshal(foo, System.out);
    }

}

Выходные данные

Ниже приведен результат запуска демонстрационного кода.Оба поля имели нулевые значения.Поле без аннотации @XmlElement не было маршалировано, а поле с @XmlElement(nillable=true) маршалировано, как и ожидалось в JSON.

{
   "foo" : null
}

Для получения дополнительной информации

0 голосов
/ 15 октября 2010

Я думаю, что функциональность json такая же, она не будет показывать вам нулевые значения в строке Json.Предположим, например, у вас есть объект с двумя атрибутами, скажем, возраст и имя.Теперь, если возраст равен 7, а name равно null, то, если, по вашему мнению, name также должно быть включено в объект JSON, тогда вы должны исправить код для явной обработки десериализации того же кода.тогда вам придется обработать объект с нулевым значением, так как JSON будет обрабатывать «null» как строку и назначит его объекту, который сделает ваш объект с name = "null", что неверно.если вы хотите достичь того же, вы должны расширить класс JSON-объект и написать собственную реализацию.

...