【问题标题】:Is it practical to combine XML Schema and an XML-to-JSON conversion?结合 XML Schema 和 XML 到 JSON 的转换是否可行?
【发布时间】:2013-11-01 15:00:15
【问题描述】:

我必须指定一个 JSON 数据结构;该数据结构将成为接口描述的一部分,数据将由 JavaScript 处理。为数据传输设置了 JSON。在其他项目中,我们使用 XML 而不是 JSON,为此我使用了丰富的 XML 模式。不幸的是,我现在不能这样做。

我做了一些研究,发现JSON Schema。 不过,这仍然是草稿状态,这让我觉得在这种情况下使用它有点不方便。

我还遇到了this question,讨论如何将 XML 映射到 JSON。 org.json 命名空间中的 XML class 似乎有一个标准 (?) 转换。对于没有混合内容的 XML 文档,转换似乎相当简单。

所以想法是使用XML Schema来描述数据结构,在服务器端尽可能使用我们现有的XML处理(编辑、转换、验证……)工具,并将XML DOM转换为JSON而已在将数据交付给 JSON 消费者之前。

数据传输是单向的,我们不会有混合内容的 XML。

也许有人以前试过这个?当(从概念上)应用于 JSON 文档时,从 XML Schema 的语义对于客户端程序员来说仍然足够清晰的意义上来说,这是否是一种实用的方法?有什么特别的陷阱需要注意吗?

【问题讨论】:

    标签: java xml json xsd


    【解决方案1】:

    如果我理解你的想法是正确的,你想使用 XML 模式作为你数据交换的主要模型 - 用于 XML 以及 JSON 格式。

    这个想法有两个部分:

    • 使用单一来源对所有数据交换进行建模。
    • 使用 XML Schema 作为这个单一来源。

    单源模型

    第一个想法将您带到 MDD (Model-Driven Development) 或 MDA (Model-Driven Architecture),它们在 2002-2005 年左右大肆宣传。这是大量 UML、供应商驱动的炒作,但有不少合理的东西(如 AndroMDA)幸存下来。

    一般来说,MDA 是个好主意。只要你做“标准”的事情,它就可以很好地工作。但如果您想“自定义”,那可能是一场噩梦。

    在您的情况下,我肯定会说单源模型是有道理的。这是关于数据交换的。在核心中,这可以简化为非常简单的模型,这些模型仍然足够强大,可以表达您需要的一切。

    JSON 就是一个例子。 JSON 比 XML 更简单,但仍然足够强大。它清楚地表明,只要你有基本的原始类型、对象、数组和嵌套,你几乎可以表达任何东西。

    这种“单一源模型”不一定是 UML,它可以是任何强大到足以涵盖所有底层需求的东西。

    “单一来源模型”的主要问题是定制。你知道,90% 的 OOTB 效果很好,但是在 10% 中你没有得到你想要的结果,必须定制,然后努力得到你。大多数生成工具都有一些“插件”。因此,如果您符合 90% 的要求,那么您很幸运,否则您可能需要了解生成工具的复杂内部结构。

    总而言之,单源模型是个好主意,只要它满足所有需求,并且为所需场景调整/应用它​​的努力并不比从头开始制作更大.

    XML Schema 作为模型

    下一个问题是 XML Schema 是否适合作为单一来源模型。

    您可能听说过或使用过JAXB,它有一个schema compiler (XJC)。此编译器可以获取您的 XML 模式,然后生成带有 JAXB 注释的 Java 类。然后可以使用这些类将 XML 解组为 Java 对象或将这些对象编组为 XML。

    到 JSON:

    JAXB Mapping to JSON

    看起来你也可以从这些类中生成 JSON Schema(虽然我自己还没有尝试过):

    How to generate JSON schema from a JAXB annotated class?

    所以 XML Schema-first 方法有效。你可以称之为schema-driven development(我在此声明这个词的版权)。

    我个人做了很多事情——首先为 XJC 写了一些工具/插件。例如:

    • Hyperjaxb 使模式派生类可通过 JPA 持久化。
    • Jsonix 基本上是纯 JavaScript 的 JAXB 端口。

    我的经验是,您可以先做很多事情,但我也不得不说 XML Schema 很好,但不是最好或最简单的模型。该规范很复杂,如果您查看模式派生类,那么您会发现一些不太适合 Java bean 和属性的构造。例如,@XmlElementRef 是一个复杂且通常看起来很奇怪的构造——它仍然是涵盖许多可以在 XML 模式中轻松表达的情况所必需的。在我编写的所有工具中,我总是不得不与此类构造的案例、corder case 和corner case 作斗争。

    XML Schema,如果你保持简单和整洁,可能会很漂亮。映射完美的 bean 和属性,易于理解和使用,大量的工具支持。所以XML Schema 并不是建模或指定数据交换的最差选择

    但它也可能变得非常复杂。我看到了很多过度设计的模式,它们非常难以使用 - 收获很少。有时模式设计者只是不太了解 XML 模式,有时却太了解它了。上次我帮助制定“XML Schema 设计最佳实践”时,我们找到了 60 多页的“注意事项”文档。所以很容易弄错 XML Schemas。

    但是,正如我上面所说,如果它保持简单和干净,它可能会很漂亮。

    有什么选择?

    好吧,您实际上可以使用 Java 代码作为模型源。带注释的 POJO 在表达上足够强大且用途广泛,但使用起来仍然非常简单。您不是模式优先,而是 Java 代码优先,但您仍然可以执行所有相同的技巧。您可以 generate an XML Schema 根据您的注释类。您可以使用MOXy 进行持久性(以及更多)。你可以做 JSON just as well.

    总结并回答您的问题:

    • 是的,它很实用,而且效果很好。
    • 除了架构优先的方法,还可以考虑 Java 优先的方法。
    • 您拥有获取 XML-Objects-JSON-Persistence 的工具。
    • 存在缺陷(见上文)。

    希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      由于到目前为止没有人回答这个问题并且我们已经开始遵循这种方法,所以我很快总结说,对我们来说,这种方法通常效果很好。我们设计了一个非常丰富的 XML Schema,作为服务器和 Web 客户端之间契约的一部分。 JSON 一对一地遵循 XML,因此 XML Schema 也自然地读取 JSON 文档。

      我们注意到的唯一小问题是,我们使用的规范 XML 到 JSON 转换(不支持 Schema)在树中某处只有一个子元素时创建了一个对象,即使 XML Schema 对该元素的上限为“许多”。这意味着程序员必须在 JSON 端处理对象值和集合之间的一些多态性。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-02
        • 1970-01-01
        • 2017-06-11
        • 1970-01-01
        • 2014-05-29
        相关资源
        最近更新 更多