我想在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
}
这里有什么问题?
答案 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
}
了解更多信息