在其他工作之间,我最近一直在审查WADL规范,以解决一些文档问题,以生成更新版本。 因为显而易见的一件事是缺少对XML以外的语言的语法支持-是的,您可以使用JSON <-> XML Schema的映射,但这对于JSON纯粹主义者而言并不令人满意。
因此,我开始研究如何在服务的WADL描述中附加JSON文档的JSON-Schema语法。 这还不是一个规范。 但是有关它可能如何始终如一地工作的建议。
现在,我主要使用Jersey,因此,请考虑Jersey当前将为返回XML和JSON的服务生成什么。 因此,此处的服务是使用JAX-B绑定实现的,因此它们都使用与include的XML-Schema参考定义的结构类似的结构。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<application xmlns="http://wadl.dev.java.net/2009/02"><doc xmlns:jersey="http://jersey.java.net/" jersey:generatedBy="Jersey: 1.16-SNAPSHOT 10/26/2012 09:28 AM"/><grammars><include href="xsd0.xsd"><doc title="Generated" xml:lang="en"/></include></grammars><resources base="http://localhost/"><resource path="/root"><method id="hello" name="PUT"><request><representation xmlns:m="urn:message" element="m:requestMessage" mediaType="application/json" /><representation xmlns:m="urn:message" element="m:requestMessage" mediaType="application/xml" /></request><response><representation xmlns:m="urn:message" element="m:responseMessage" mediaType="application/json"/><representation xmlns:m="urn:message" element="m:responseMessage" mediaType="application/xml" /></response></method></resource></resources>
</application>
因此,我们考虑的第一件事是在表示形式元素上重用现有的元素属性(定义为QName),以引用导入的JSON-Schema。 除了没有元素的XML元素外,这里还显示了一个和另一个任意的名字空间。
<grammars><include href="xsd0.xsd" /><include href="application.wadl/responseMessage" /></grammars><representation element="responseMessage" mediaType="application/json"/>Orxmlns:json="http://wadl.dev.java.net/2009/02/json" <representation element="json:responseMessage" mediaType="application/json" />
问题在于,目前的JSON-Schema规范没有“ name”属性的概念,因此每个JSON-Schema都由其URI唯一标识。 同样,从我阅读的规范中,每个JSON-Schema最多包含一个文档的定义-而不是XML-Schema中可以包含的多个类型/文档。
因此,下一个最佳建议是仅使用URI的“文件名”部分作为URI的代理。 但是当然这不一定是唯一的。 例如,我可以看到美国政府和雅虎都在这里发布了自己的“地址”微格式。
解决此问题的更好方法是引入一个新属性,幸运的是,WADL规范是在考虑到这一点而设计的,它是URI类型,可用于直接引用JSON-Schema定义。 因此,与上一个示例中的直接导入不同,我们在元素本身上具有URI属性。 “ describeby”属性名称来自JSON-Schema建议,并且与规范中原子链接上使用的rel一致。
xmlns:json="http://wadl.dev.java.net/2009/02/json-schema" xmlns:m="urn:message" <grammars><include href="xsd0.xsd" /></grammars><representation mediaType="application/json"element="m:responseMessage" json:describedby="application.wadl/responseMessage" />
的第二个优点是,该格式与依赖XML-Schema语法的工具向后兼容。 尽管对于像我这样从事工具/测试工具的人们来说,这可能只是有趣的事情。
一旦有了JSON-Schema定义,那么一些用户将想一起废除XML,因此,最后这里是WADL到仅包含JSON-Schema信息的JSON文档的简单映射。 Sergey Breyozkin已建议JSON映射仅显示json语法,而我正在考虑这种思维方式。 我很想听到一个想要访问XML Schema的JSON映射用例。
{"doc":{"@generatedBy":"Jersey: 1.16-SNAPSHOT 10/26/2012 09:28 AM"},"resources":{"@base":"http://localhost/","resource":{"@path":"/root","method":{"@id":"hello","@name":"PUT","request":{"representation":[{"@mediaType":"application/json","@describedby":"application.wadl/requestMessage"}]},"response":{"representation":[{"@mediaType":"application/json","@describedby":"application.wadl/responseMessage"}]}}}}
}
我目前正在使用“ application / vnd.sun.wadl + json”的MIME类型来使此映射与默认的WADL MIME类型一致。 我怀疑我们将来会希望改变这种情况; 但这对初学者来说确实有用。
因此,这都是非常有趣的,但是除非有示例实现,否则您将无法使用它。 我在Jersey和wadl2java中分别为服务器端和Java客户端生成器工作,这将是我下一篇文章的主题。 我一直在泽西团队的Pavel Bucek上研究这些实现和WADL提案,非常感谢他的支持。
翻译自: https://www.javacodegeeks.com/2012/11/json-schema-in-wadl.html