【问题标题】:MOXy compatible XML and JSON responsesMOXy 兼容的 XML 和 JSON 响应
【发布时间】:2013-10-06 21:07:35
【问题描述】:

我有一个带有 JAXB 注释的 POJO,它可以很好地编组到 xml 和 json,但是,xml 和 json 不兼容,因为根标签在 json 中丢失了。我知道它在 json 中更有意义,但我仍然需要根元素。有没有办法得到它?

@XmlRootElement(name = XmlConsts.ELEMENT)
@XmlAccessorType(XmlAccessType.FIELD)
public class Element {
    private static final String MULTIPLE_VALUE_DELIMITER = ",";

    @XmlElement(name = XmlConsts.PROPERTIES)
    @XmlJavaTypeAdapter(JaxbMapAdapter.class)
    private final Map<String, String> entries;

    @XmlAttribute(name = XmlConsts.ELEMENT_TYPE, required = false)
    public String getType() {
        return entries.get(XmlConsts.ELEMENT_TYPE);
    }
    ...

结果 xml:

<element type="rule.record">
  <properties>
    <property name="min" value="0"/>
    <property name="id" value="1773"/>
...

结果 json:

{"type":"rule.record","properties":{
"property":[
{"name":"min","value":"0"},
{"name":"id","value":"1773"}

如此处所示,“元素”标签在 json 中丢失了。有没有办法获取根元素?

【问题讨论】:

    标签: java xml json jaxb moxy


    【解决方案1】:

    以下是可以根据您运行的环境的几种方法:

    独立示例

    当使用标准 JAXB API 时,MOXy 将在编组为 JSON 时包含根元素。可以使用 JAXBContextProperties.JSON_INCLUDE_ROOT 属性更改此行为。如果创建JAXBContext时已经设置为false,可以在Marshaller上设置回true

    import java.util.*;
    import javax.xml.bind.*;
    import org.eclipse.persistence.jaxb.JAXBContextProperties;
    import org.eclipse.persistence.jaxb.MarshallerProperties;
    
    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[] {Foo.class}, properties);
    
            Foo foo = new Foo();
            foo.setBar("Hello World");
    
            Marshaller marshaller = jc.createMarshaller();
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
            marshaller.setProperty(MarshallerProperties.JSON_INCLUDE_ROOT, true);
            marshaller.marshal(foo, System.out);
        }
    
    }
    

    JAX-RS 和MOXyJsonProvider

    MOXy 包含MessageBodyReader/MessageBodyWriter 的实现,这使得将 MOXy 配置为 JSON 绑定提供程序变得很容易。默认情况下,MOXyJsonProvider 配置为不包含根元素。您可以通过在 JAX-RS Application 类上设置配置实例来更改此设置,如下所示。

    import java.util.*;
    import javax.ws.rs.core.Application;
    import org.eclipse.persistence.jaxb.rs.MOXyJsonProvider;
    
    public class FooApplication  extends Application {
    
        @Override
        public Set<Class<?>> getClasses() {
            HashSet<Class<?>> set = new HashSet<Class<?>>(1);
            set.add(ExampleService.class);
            return set;
        }
    
        @Override
        public Set<Object> getSingletons() {
            MOXyJsonProvider moxyJsonProvider = new MOXyJsonProvider();
            moxyJsonProvider.setIncludeRoot(true);
    
            HashSet<Object> set = new HashSet<Object>(1);
            set.add(moxyJsonProvider);
            return set;
        }
    
    } 
    

    更多信息

    MOXy 作为 Jersey/GlassFish 中的默认 JSON 绑定提供程序

    如果您使用 MOXy 作为 Jersey/GlassFish 的默认 JSON 绑定提供程序,您可以利用 MoxyJsonConfig 类,如下所示:

    import javax.ws.rs.ext.*;
    import org.glassfish.jersey.moxy.json.MoxyJsonConfig;
    
    @Provider
    public class MOXyJsonContextResolver implements ContextResolver<MoxyJsonConfig> {
    
        private final MoxyJsonConfig config;
    
        public MOXyJsonContextResolver() {
            config = new MoxyJsonConfig()
                .setIncludeRoot(true);
        }
    
        @Override
        public MoxyJsonConfig getContext(Class<?> objectType) {
            return config;
        }
    
    }
    

    更多信息

    【讨论】:

      猜你喜欢
      • 2019-02-13
      • 1970-01-01
      • 2014-02-19
      • 1970-01-01
      • 1970-01-01
      • 2013-06-02
      • 1970-01-01
      • 2016-11-13
      • 2011-09-21
      相关资源
      最近更新 更多