JAXB删除XmlRootElement包装器
我有一个@XmlRootElement类的人JAXB删除XmlRootElement包装器,xml,json,jaxb,marshalling,jaxb2,Xml,Json,Jaxb,Marshalling,Jaxb2,我有一个@XmlRootElement类的人 @XmlRootElement class Person { private String desc; } 返回的内容是 {"Person": {"desc": "abc"} } 我真的不想要根包装器,所以我希望内容看起来像 {"desc": "abc"} 我可以通过JaxB实现这一点吗?如果是,怎么做?谢谢 JAXB是XML的API,而不是JSON 然而,有些JSON库(至少Jackso
@XmlRootElement
class Person {
private String desc;
}
返回的内容是
{"Person": {"desc": "abc"} }
我真的不想要根包装器,所以我希望内容看起来像
{"desc": "abc"}
我可以通过JaxB实现这一点吗?如果是,怎么做?谢谢 JAXB是XML的API,而不是JSON 然而,有些JSON库(至少Jackson)可以利用JAXB注释。我不知道你用的是哪一种,所以我不知道如何提供最好的帮助。(如果您在Jersey框架中使用它,它将使用Jackson进行JSON序列化。)您将需要配置所使用的JSON库,以便能够在JSON输出中配置根元素的“包装” 我编写了这个快速Groovy脚本来在Jackson中进行测试:
@Grab('com.fasterxml.jackson.core:jackson-databind:2.2.2')
import javax.xml.bind.annotation.XmlRootElement
import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.databind.SerializationFeature
@XmlRootElement
public class Person {
public String desc = "howdy"
}
Person p = new Person()
ObjectMapper om = new ObjectMapper().enable(SerializationFeature.WRAP_ROOT_VALUE)
println om.writeValueAsString(p)
如上所述,它输出JSON:
{"Person":{"desc":"howdy"}}
如果取出零件.enable(SerializationFeature.WRAP\u ROOT\u VALUE)
它将为您提供:
{"desc":"howdy"}
因此,如果您使用的是Jackson,那么后台使用的ObjectMapper似乎被设置为
WRAP\u ROOT\u VALUE
,您只需将其关闭。注意:我是该专家组的负责人和成员
因为JAXB(JSR-222)涵盖的是XML而不是JSON绑定。然而,在这个空间中,JAXB经常被直接使用(JAXB impl与类似于Jettison的东西一起用于将JSON转换为StAX事件或从StAX事件转换JSON,请参见:)和间接使用(解释JAXB注释子集的JSON绑定实现)
下面是如何利用EclipseLink MOXy作为JAXB提供者来完成您的用例
Java模型
人
下面是您问题中的人员
类。我添加了@xmlacessortype(xmlacesstype.FIELD)
注释,以避免添加访问器方法(请参阅:)
import javax.xml.bind.annotation.*;
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
班主任{
私有字符串描述;
}
jaxb.properties
如果使用MOXy作为JAXB提供程序,则需要在与域模型相同的包中包含一个名为JAXB.properties
的文件,其中包含以下条目(请参见:)
演示代码
演示
演示代码中有几点需要注意:
JAXBContextProperties.MEDIA\u TYPE
属性用于将MOXy置于JSON绑定模式JAXBContextProperties.JSON\u INCLUDE\u ROOT
属性用于告诉MOXy忽略根元素Class
参数的unmarshal
方法之一告诉MOXy您正在解组的类型import java.util.*;
导入javax.xml.bind.*;
导入javax.xml.transform.stream.StreamSource;
导入org.eclipse.persistence.jaxb.JAXBContextProperties;
公开课演示{
公共静态void main(字符串[]args)引发异常{
映射属性=新的HashMap(2);
put(JAXBContextProperties.MEDIA_类型,“application/json”);
put(JAXBContextProperties.JSON_INCLUDE_ROOT,false);
JAXBContext jc=JAXBContext.newInstance(新类[]{Person.Class},属性);
Unmarshaller Unmarshaller=jc.createUnmarshaller();
StreamSource json=新的StreamSource(“src/forum18417466/input.json”);
Person=unmarshaller.unmarshal(json,Person.class).getValue();
Marshaller=jc.createMarshaller();
setProperty(marshaller.JAXB_格式化的_输出,true);
封送员。封送员(人员、系统、输出);
}
}
input.json/Output
{
“描述”:“abc”
}
谢谢!我可以在属性文件中设置JAXBContextProperties.JSON_INCLUDE_根。我正在使用CXF和抛弃。谢谢!我可以在属性文件中设置JAXBContextProperties.JSON_INCLUDE_根。我正在使用CXF和Dettison(在“使用ServerFactoryBeans”下),它显示了MappedXMLInputFactory
和MappedXMLOutputFactory
的实例化。我的猜测是(我从未使用过抛弃)您可以在这些上设置配置。
javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory