对象-JSON- JAXB显示null

时间:2010-10-14 23:05:38

标签: java json api jaxb marshalling

我想在JSON表示中将空对象封送为null。 但是,现在,如果对象为空,我没有看到JSON中的元素。

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 个答案:

答案 0 :(得分:4)

首先要做的事:JAXB不做JSON。它是一个XML API。所以你可能正在使用一个框架(我的猜测:JAX-RS实现可能像泽西岛)?有必要知道你正在使用哪一个来提供更多帮助。

假设这一点,问题是,使用JAXB注释的包如何指导JSON序列化。一些基本上将对象转换为XML(逻辑结构或完整xml),然后使用约定转换为JSON。由于XML和JSON之间的数据模型不同,这可能会导致数据丢失。

现在:大多数JAX-RS实现的简单解决方案是根本不使用基于JAXB注释的方法,但是JSON特定的序列化器,例如Jackson的JacksonJsonProvider(Jackson实际上也可以使用JAXB注释) )。默认情况下,它将包含属性的空值,尽管如果您想要抑制空值,这是可配置的。

以下是JavaDoc,其中显示了如何使用Jackson提供程序(指定FEATURE_POJO_MAPPING进行配置),如果这可能会有所帮助。

答案 1 :(得分:0)

我认为json的功能只是这样,它不会在Json字符串中显示空值。假设一个例子,你有一个具有两个属性的对象,比如年龄和名字。现在,如果年龄为7且name为null,那么如果根据您的名称,名称也应该包含在JSON对象中,那么您必须对代码进行显式处理,以显式处理相同代码的反序列化。那么你将不得不处理空值的事情,因为JSON会将“null”视为一个字符串,并将它分配给将使你的对象名为“null”的对象,这是错误的。

如果要实现相同的目标,那么必须扩展类JSON对象并编写自己的实现。

答案 2 :(得分:0)

注意:我是EclipseLink JAXB (MOXy)负责人和JAXB (JSR-222)专家组的成员。

EclipseLink JAXB(MOXy)为JSON提供本机支持。下面是一个示例,说明如何利用@XmlElement注释来映射您的用例:

<强>富

默认情况下,JAXB实现不会封送null属性。您可以通过将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
}

了解更多信息