有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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
    }

我做错了什么


共 (3) 个答案

  1. # 1 楼答案

    我认为json的功能就是这样,它不会在json字符串中显示空值。假设有一个示例,您有一个具有两个属性的对象,即年龄和名称。现在,如果年龄为7,name为null,那么如果根据您的说法,name也应该包含在JSON对象中,那么您必须修改代码以显式处理相同代码的反序列化。然后您必须处理空值的事情,因为JSON将把“null”作为字符串处理,并将其分配给对象,这将使您的对象具有name=“null”,这是错误的

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

  2. # 2 楼答案

    注意:我是EclipseLink JAXB (MOXy)领导和JAXB (JSR-222)专家组成员

    EclipseLink JAXB(MOXy)提供了对JSON的本机支持。下面是如何利用@XmlElement注释映射用例的示例:

    Foo

    默认情况下,JAXB实现不会封送null属性。您可以通过将@XmlElement上的nillable属性设置为true来更改此行为

    package forum3938279;
    
    import javax.xml.bind.annotation.*;
    
    @XmlAccessorType(XmlAccessType.FIELD)
    class Foo {
          @XmlElement(nillable=true)
          private Integer foo;
          private Integer another_foo;
    
    }
    

    jaxb。属性

    要将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
    }
    

    了解更多信息

  3. # 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_映射),如果这可能有帮助的话