在其他工作之間,我最近一直在審查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