JSON JAXB对象的java显示空值
我想在JSON表示中将null对象封送为null。 但是,现在,如果对象为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。(@xmlement(nillable=true)
这使得反应看起来像
"foo" :{
"another_foo" : something
"foo":{nil :true}
}
我希望它是这样的
"foo" :{
"another_foo":something
"foo" : null
}
我做错了什么
# 1 楼答案
我认为json的功能就是这样,它不会在json字符串中显示空值。假设有一个示例,您有一个具有两个属性的对象,即年龄和名称。现在,如果年龄为7,name为null,那么如果根据您的说法,name也应该包含在JSON对象中,那么您必须修改代码以显式处理相同代码的反序列化。然后您必须处理空值的事情,因为JSON将把“null”作为字符串处理,并将其分配给对象,这将使您的对象具有name=“null”,这是错误的
如果要实现同样的目标,那么必须扩展类JSON对象并编写自己的实现
# 2 楼答案
注意:我是EclipseLink JAXB (MOXy)领导和JAXB (JSR-222)专家组成员
EclipseLink JAXB(MOXy)提供了对JSON的本机支持。下面是如何利用
@XmlElement
注释映射用例的示例:Foo
默认情况下,JAXB实现不会封送null属性。您可以通过将
@XmlElement
上的nillable
属性设置为true来更改此行为jaxb。属性
要将MOXy指定为JAXB提供程序,必须在与域模型相同的包中包含一个名为
jaxb.properties
的文件,并带有以下条目:演示
输出
下面是运行演示代码的输出。两个字段都有空值。没有
@XmlElement
注释的字段没有被封送,而带有@XmlElement(nillable=true)
的字段按照JSON中的预期封送了解更多信息
# 3 楼答案
第一件事:JAXB不做JSON。它是一个XMLAPI。所以您可能正在使用一个框架(我猜:JAX-RS实现,比如Jersey)?有必要知道你用哪一个来提供更多的帮助
假设这样,问题是,包如何使用JAXB注释来指导JSON序列化。一些基本上将对象转换为XML(逻辑结构或完整XML),然后使用约定转换为JSON。由于XML和JSON之间的数据模型不同,这可能会导致数据丢失
现在:大多数JAX-RS实现的简单解决方案是根本不使用基于JAXB注释的方法,而是使用特定于JSON的序列化程序,例如Jackson的JacksonJsonProvider(Jackson实际上也可以使用JAXB注释)。默认情况下,它将包括属性的null值,尽管在您想要抑制null的情况下,这是可配置的
下面是JavaDoc,它展示了如何在Jersey中使用Jackson provider(为配置指定FEATURE_POJO_映射),如果这可能有帮助的话