结合XML Schema和XML-to-JSON转换是否可行?

时间:2013-10-23 11:04:13

标签: java xml json xsd

我必须指定一个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的语义是否仍然足够清晰,这是否是一种实用的方法?是否有任何特殊的陷阱需要注意?

2 个答案:

答案 0 :(得分:2)

如果我理解你的想法,你想使用XML Schema作为数据交换的主要模型 - 对于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 Schema,然后使用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方法有效。您可以将其称为模式驱动的开发(我在此声明此术语的版权)。

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

  • Hyperjaxb使得JPA可以使用模式派生类。
  • Jsonix是纯粹JavaScript的JAXB端口。

我的经验是你可以先做很多架构,但我还要说XML Schema很好但不是最好或最简单的模型。规范很复杂,如果你看看模式派生类,那么你可以发现一些不适合Java bean和属性的结构。例如,@XmlElementRef是一个复杂且通常看起来很奇怪的构造 - 它必须涵盖您可以在XML Schema中轻松表达的大量案例。在我写的所有工具中,我总是不得不与案件和corder案件以及此类构造的角落案件的角落案件作斗争。

XML Schema,如果你保持简洁和整洁,可能很漂亮。地图完美的豆类和属性,易于理解和使用,许多工具支持。因此, XML Schema不是建模或指定数据交换的最差选择

但它也可以像地狱一样复杂。我看到了许多过度设计的模式,这些模式非常难以使用 - 获得的收益很少。有时架构设计人员不太了解XML Schema,有时也知道得太清楚。上次我帮助制定了" XML Schema设计最佳实践",我们登陆了60多个页面文件,并且没有做过。因此,XML Schema很容易出错。

但是,正如我上面所说,如果它保持简单和干净,它可能是美化的。

有哪些替代方案?

好吧,您可能实际上使用Java代码作为模型源。带注释的POJO表达能力强,功能多样,但仍然很容易使用。你不是架构优先的,那么你首先是Java代码,但是你仍然可以做所有相同的技巧。您可以generate an XML Schema根据您的注释课程。您可以使用MOXy执行持久性(以及更多)。你可以做JSON just as well

总结并回答您的问题:

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

希望这有帮助。

答案 1 :(得分:0)

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

我们注意到的唯一一个小问题是,当树中某处只有一个子元素时,我们使用的规范XML-to-JSON转换(不支持Schema)会创建一个单独的对象,即使是XML架构的上边界有很多'对于那个元素。这意味着程序员必须在JSON端处理对象值和集合之间的某些多态性。