@XmlRootElement
class Person{
String id;
String name;
}
JSON
{
“id”:null
}
我想找到设置为null的id,并且在json中没有给出名称。我知道对象设置为null的方法将调用set方法。但是我有很多对象我不想这样做那。如果有一般方法。 我需要你帮助@Blaise Doughan
答案 0 :(得分:0)
您可以使用JAXBElement
。 JAXBElement
的一个角色是处理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
}