moxy如何找到对象集null或者没有给出对象

时间:2014-01-24 08:11:37

标签: null jaxb moxy

@XmlRootElement
class Person{
String id;
String name;
}

JSON
{
“id”:null
}

我想找到设置为null的id,并且在json中没有给出名称。我知道对象设置为null的方法将调用set方法。但是我有很多对象我不想这样做那。如果有一般方法。 我需要你帮助@Blaise Doughan

1 个答案:

答案 0 :(得分:0)

您可以使用JAXBElementJAXBElement的一个角色是处理XML元素既可以是可选的又是可选的情况:

<element name="foo" type="string" nillable="true" minOccurs="0"/>

域模型

<强>人

我们将利用对JAXBElement的字段访问权限(请参阅:http://blog.bdoughan.com/2011/06/using-jaxbs-xmlaccessortype-to.html),并对我们的访问者方法进行编码以查看我们想要的方式。

import javax.xml.bind.JAXBElement;
import javax.xml.bind.annotation.*;
import javax.xml.namespace.QName;

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
class Person {

    static final String ID = "id";
    static final String NAME = "name";

    @XmlElementRef(name=ID)
    JAXBElement<String> id;

    @XmlElementRef(name=NAME)
    JAXBElement<String> name;

    public String getId() {
        if(null == id) {
            return null;
        } else {
            return id.getValue();
        }
    }

    public void setId(String id) {
        this.id = new JAXBElement<String>(new QName(ID), String.class, id);
    }

    public String getName() {
        if(null == name) {
            return null;
        } else {
            return name.getValue();
        }

    }

    public void setName(String name) {
        this.name = new JAXBElement<String>(new QName(NAME), String.class, name);
    }

}

<强>的ObjectFactory

当我们在字段上使用JAXBElement时,我们需要在使用@XmlElementDecl注释的类上使用相应的@XmlRegistry

import javax.xml.bind.JAXBElement;
import javax.xml.bind.annotation.*;
import javax.xml.namespace.QName;

@XmlRegistry
public class ObjectFactory {

    @XmlElementDecl(name=Person.ID)
    public JAXBElement<String> createId(String id) {
        return new JAXBElement<String>(new QName(Person.ID), String.class, id);
    }

    @XmlElementDecl(name=Person.NAME)
    public JAXBElement<String> createName(String name) {
        return new JAXBElement<String>(new QName(Person.NAME), String.class, name);
    }

}

演示代码

下面是一些代码,您可以运行以显示一切正常。

<强>演示

import java.util.*;
import javax.xml.bind.*;
import org.eclipse.persistence.jaxb.JAXBContextProperties;

public class Demo {

    public static void main(String[] args) throws Exception {
        Map<String, Object> properties = new HashMap<String, Object>(2);
        properties.put(JAXBContextProperties.MEDIA_TYPE, "application/json");
        properties.put(JAXBContextProperties.JSON_INCLUDE_ROOT, false);
        JAXBContext jc = JAXBContext.newInstance(new Class[] {ObjectFactory.class, Person.class}, properties);

        Person person = new Person();
        person.setId(null);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(person, System.out);
    }

}

<强>输出

{
   "id" : null
}