gpt4 book ai didi

json - 一个领域模型,多个 json View

转载 作者:行者123 更新时间:2023-12-04 12:35:19 26 4
gpt4 key购买 nike

我们有一组域类,它们使用 jersey 服务通过 jackson 序列化为 json。我们目前正在使用 JAXB 对类进行注释(尽管我们不依赖于此)。这工作正常。但是我们想为不同的用例提供不同的类序列化。

  • 网站
  • 移动应用程序
  • 管理工具
  • 公共(public) API

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

    为 Jersey 的不同服务端点管理不同的 json 映射的最佳实践是什么?

    谢谢!

    最佳答案

    注意: 我是 EclipseLink JAXB (MOXy) 的负责人,也是 JAXB (JSR-222) 专家组的成员。

    MOXy 提供基于 JAXB 注释的 JSON 绑定(bind)以及允许您将备用映射应用到域模型的外部绑定(bind)文档。我将在下面用一个例子来演示。

    元数据作为 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 Binding with EclipseLink MOXy - Twitter Example
  • MOXy as Your JAX-RS JSON Provider - MOXyJsonProvider
  • MOXy's XML Metadata in a JAX-RS Service
  • Specifying EclipseLink MOXy as Your JAXB Provider
  • 关于json - 一个领域模型,多个 json View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10761762/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com