WADL中的JSON模式

在其他工作之间,我最近一直在审查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"/>

Or
    xmlns: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提案,非常感谢他的支持。

参考:来自Gerard Davison博客博客的JCG合作伙伴 Gerard Davison提供的WADL中的JSON-Schema

翻译自: https://www.javacodegeeks.com/2012/11/json-schema-in-wadl.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值