一个域模型,多个JSON视图

我们有一组领域类,它们使用泽西服务通过杰克森序列化为json。 我们目前正在使用JAXB对类进行注释(尽管我们并未与此绑定)。 这工作正常。 但是我们想为不同的用例提供不同的类的序列化。

  • 网站
  • 移动应用
  • 管理工具
  • 公共API
  • 在每种情况下,都有不同的字段,我们可能会或可能不希望包含在json视图中。 例如,管理工具可能需要一些参数来设置数据权限。 移动客户端需要不同于网站的媒体流的URL。 该网站具有特定的字段命名约定。

    管理Jersey中不同服务端点的json的不同映射的最佳做法是什么?

    谢谢!


    注意:我是EclipseLink JAXB(MOXy)领导和JAXB(JSR-222)专家组的成员。

    MOXy提供基于JAXB注释的JSON绑定以及允许您将备用映射应用于域模型的外部绑定文档。 我将在下面举例说明。

    元数据作为JAXB注释

    以下是使用标准JAXB注释的简单Java模型映射。

    package forum10761762;
    
    import javax.xml.bind.annotation.*;
    
    @XmlAccessorType(XmlAccessType.FIELD)
    public class Customer {
    
        int id;
    
        @XmlElement(name="first-name")
        String firstName;
    
        @XmlElement(name="last-name")
        String lastName;
    
    }
    

    备用元数据#1(alternate1.xml)

    在这里,我们将使用XML映射文档通过使其成为@XmlTransient来取消映射几个字段。

    <?xml version="1.0"?>
    <xml-bindings
        xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm"
        package-name="forum10761762">
        <java-types>
            <java-type name="Customer">
                <java-attributes>
                    <xml-transient java-attribute="id"/>
                    <xml-transient java-attribute="firstName"/>
                 </java-attributes>
            </java-type>
        </java-types>
    </xml-bindings>
    

    替代元数据#2(alternate2.xml)

    在这里,我们将使用MOXy基于路径的映射扩展将Java模型映射到不同的JSON结构。

    <?xml version="1.0"?>
    <xml-bindings
        xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm"
        package-name="forum10761762">
        <java-types>
            <java-type name="Customer">
                <java-attributes>
                    <xml-element java-attribute="firstName" xml-path="personalInfo/firstName/text()"/>
                    <xml-element java-attribute="lastName" xml-path="personalInfo/lastName/text()"/>
                 </java-attributes>
            </java-type>
        </java-types>
    </xml-bindings>
    

    演示代码

    package forum10761762;
    
    import java.util.*;
    import javax.xml.bind.*;
    import org.eclipse.persistence.jaxb.JAXBContextProperties;
    
    public class Demo {
    
        public static void main(String[] args) throws Exception {
            Customer customer = new Customer();
            customer.id = 123;
            customer.firstName = "Jane";
            customer.lastName = "Doe";
    
            Map<String, Object> properties = new HashMap<String, Object>();
            properties.put(JAXBContextProperties.MEDIA_TYPE, "application/json");
            properties.put(JAXBContextProperties.JSON_INCLUDE_ROOT, false);
    
            // Output #1
            JAXBContext jc1 = JAXBContext.newInstance(new Class[] {Customer.class}, properties);
            marshal(jc1, customer);
    
            // Output #2
            properties.put(JAXBContextProperties.OXM_METADATA_SOURCE, "forum10761762/alternate1.xml");
            JAXBContext jc2 = JAXBContext.newInstance(new Class[] {Customer.class}, properties);
            marshal (jc2, customer);
    
            // Output #2
            properties.put(JAXBContextProperties.OXM_METADATA_SOURCE, "forum10761762/alternate2.xml");
            JAXBContext jc3 = JAXBContext.newInstance(new Class[] {Customer.class}, properties);
            marshal(jc3, customer);
        }
    
        private static void marshal(JAXBContext jc, Object object) throws Exception {
            Marshaller marshaller = jc.createMarshaller();
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
            marshaller.marshal(object, System.out);
            System.out.println();
        }
    
    }
    

    产量

    以下是运行演示代码的输出。 从同一个对象模型中注意,生成了3个不同的JSON文档。

    {
       "id" : 123,
       "first-name" : "Jane",
       "last-name" : "Doe"
    }
    {
       "last-name" : "Doe"
    }
    {
       "id" : 123,
       "personalInfo" : {
          "firstName" : "Jane",
          "lastName" : "Doe"
       }
    }
    

    更多信息(来自我的博客)

  • JSON绑定与EclipseLink MOXY - Twitter示例
  • MOXy作为您的JAX-RS JSON提供程序 - MOXyJsonProvider
  • MOXy的JAX-RS服务中的XML元数据
  • 将EclipseLink MOXy指定为您的JAXB提供程序
  • 链接地址: http://www.djcxy.com/p/59821.html

    上一篇: One domain model, multiple json views

    下一篇: training tesseract for handwritten text