JAXB删除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类的人

    @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