我正在使用jax-rs并添加实体,以便通过JAXRSOutInterceptor在Jetty中进行编组, 但是JSON输出正在使用附加的空属性进行修改,如下所示: “$”:“”
JSONProvider的创建和配置如下:
JSONProvider jsonProvider = new JSONProvider();
jsonProvider.setConvertTypesToStrings(true);
jsonProvider.setIgnoreNamespaces(true);
jsonProvider.setIgnoreMixedContent(true);
jsonProvider.setUnmarshallAsJaxbElement(true);
providers.add(jsonProvider);
它也被编组为使用命名空间的XML,但我不想在JSON输出和输入中使用它们。
正在编组的对象与此类似:
@XmlRootElement(name="myObject1")
@XmlAccessorType(XmlAccessType.FIELD)
@SuppressWarnings("serial")
public class MyObject1 implements Serializable {
MyObject2 a;
MyObject2 b;
MyObject2 c;
// includes getters, setters, hashCode, equals, toString,
}
当MyObject2为:
时@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
@SuppressWarnings("serial")
public class MyObject2 implements Serializable {
String x;
String y;
List<String> z;
// includes getters, setters, hashCode, equals, toString,
}
其余输出如下:
{
"myObject1": {
"a": {
"x": "value1",
"y": "value2",
"z": "value3",
"$": ""
},
"$": ""
}
}
如何摆脱结尾“$”:“” 我读到Jettison(我正在使用的默认JSONProvider实现)默认情况下会将用@XmlValue映射的属性表示为'$'但是没有属性?
这是由实施Serializable引起的吗?
答案 0 :(得分:1)
注意:我是EclipseLink JAXB (MOXy)主管,是JAXB (JSR-222)专家组的成员。
Jettison实际上不是一个JSON提供程序,而是一个允许XML库生成/使用JSON的API。它做得不错,但有些问题可能会出现,就像你现在遇到的问题一样。您还看到了大小为1的列表未作为JSON数组编组的问题。
如果您无法找到使用当前设置的方法。以下是您可以使用MOXy作为JSON提供程序的方法:
<强> MyObject1 强>
package forum11262807;
import java.io.Serializable;
import javax.xml.bind.annotation.*;
@XmlRootElement(name="myObject1")
@XmlAccessorType(XmlAccessType.FIELD)
@SuppressWarnings("serial")
public class MyObject1 implements Serializable {
MyObject2 a;
MyObject2 b;
MyObject2 c;
}
<强> MyObject2 强>
package forum11262807;
import java.io.Serializable;
import java.util.List;
import javax.xml.bind.annotation.*;
@XmlAccessorType(XmlAccessType.FIELD)
@SuppressWarnings("serial")
public class MyObject2 implements Serializable {
String x;
String y;
List<String> z;
}
的 jaxb.properties 强>
要将MOXy指定为JAXB提供程序,您需要在与域模型相同的包中包含名为jaxb.properties
的文件,并带有以下条目:
javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
<强>演示强>
下面是一些独立的代码,用于演示JSON的读/写。
package forum11262807;
import java.io.File;
import javax.xml.bind.*;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(MyObject1.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
unmarshaller.setProperty("eclipselink.media-type", "application/json");
File json = new File("src/forum11262807/input.json");
MyObject1 myObject1 = (MyObject1) unmarshaller.unmarshal(json);
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.setProperty("eclipselink.media-type", "application/json");
marshaller.marshal(myObject1, System.out);
}
}
<强> input.json /输出强>
生成的JSON消息不包含"$"
属性,大小为1的列表是以JSON数组表示的属性。
{
"myObject1" : {
"a" : {
"x" : "value1",
"y" : "value2",
"z" : [ "value3" ]
}
}
}
JAX-RS集成
MOXy包含MOXyJsonProvider类,可以在JAX-RS应用程序中轻松配置: