现在我正在做一个使用restful的项目。在put方法中,如果客户端将json发送到服务器。如果json中没有给出对象,我们认为客户端不想修改对象,否则设置为null。 wo必须修改为null。但是现在我遇到了一个问题,如何区分对象null和moxy中没有给出的对象。
public class Person{
String id;
String name;
}
的
{
"id":"1",
"name":null,
}
与
相同{
"id":"1"
}
@Blaise Doughan你可以帮助我
答案 0 :(得分:0)
默认情况下,EclipseLink JAXB (MOXy)不会封送具有null
值的映射字段/属性。您可以通过将null
与@XmlElement(nillable=true)
映射来告诉MOXy编组null
值。我在这里详细介绍了这个:
如果您想在默认null
值和明确设置为@XmlIsSetNullPolicy
的值之间进行区分,那么您将需要跟踪它。跟踪后,您可以使用MOXy的import javax.xml.bind.annotation.XmlElement;
import org.eclipse.persistence.oxm.annotations.XmlIsSetNullPolicy;
import org.eclipse.persistence.oxm.annotations.XmlMarshalNullRepresentation;
public class Root {
@XmlElement
private String foo;
@XmlElement(nillable = true)
private String bar;
private String baz;
private boolean bazSet;
@XmlIsSetNullPolicy(isSetMethodName="isBazSet", nullRepresentationForXml=XmlMarshalNullRepresentation.XSI_NIL)
public String getBaz() {
return baz;
}
public void setBaz(String baz) {
this.baz = baz;
this.bazSet = true;
}
public boolean isBazSet() {
return bazSet;
}
}
进行映射。
import java.util.*;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
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[] {Root.class}, properties);
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
Root root = new Root();
marshaller.marshal(root, System.out);
root.setBaz(null);
marshaller.marshal(root, System.out);
}
}
<强>演示强>
foo
<强>输出强>
在下面的输出中,我们看到:
bar
没有被整理出来。baz
正在编组。null
在未设置时未进行编组,并且在设置时进行编组,即使该值均为{
"bar" : null
}
{
"bar" : null,
"baz" : null
}
。{{1}}