2017-06-15 103 views
0

我正在嘗試使用www.hl7.org/fhir/json.html中定義的JSON模式,例如www.hl7.org/fhir/Patient.schema.json。所有FHIR JSON模式不驗證

的模式開頭:

{ 
    "$schema": "http://json-schema.org/draft-04/schema#", 
    "id": "http://hl7.org/fhir/json-schema/Patient", 
    "$ref": "#/definitions/Patient", 
    "description": "see http://hl7.org/fhir/json.html#schema for information 
    about the FHIR Json Schemas", 
    "definitions": { 
    "Patient": { 
    "allOf": [ 
    { 
     "$ref": "DomainResource#/definitions/DomainResource" 
    }, 

當我粘貼到此[www.jsonschemavalidator.net] [3]時,得到錯誤

錯誤時解決方案參考「#/定義/病人。路徑'',第1行,第1位。

如果我在「Patient」定義中移動第4行(「我可以正確驗證一些示例JSON數據。

{ 
    "$schema": "http://json-schema.org/draft-04/schema#", 
    "id": "http://hl7.org/fhir/json-schema/Patient", 
    "description": "see http://hl7.org/fhir/json.html#schema for information 
    about the FHIR Json Schemas", 
    "definitions": { 
    "Patient": { 

    "$ref": "#/definitions/Patient", 

    "allOf": [ 
    { 
     "$ref": "DomainResource#/definitions/DomainResource" 
    }, 

但是,我注意到在http://hl7.org/fhir/json.html定義的每個JSON模式都是這樣構造的。 HL7 JSON模式中的錯誤,還是www.jsonschemavalidator.net解析這些JSON模式的錯誤?

我的$裁判的理解是, 「$ REF」: 「#/定義/病人」 着眼於爲基本URL,在這種情況下是最近的父ID:

「hl7.org/fhir/JSON-模式/病人」。

該URL應該服務於www.hl7.org/fhir/Patient.schema.json,它來自根元素,它應該有一個schema元素#/ definitions/Patient,它對應於定義了$ ref的當前元素。所以看起來$ ref的正確位置應該在#/ definitions/Patient中,而不是位於ref的當前位置的上層根目錄#/ location中。

+0

請參閱此處的相關對話:https://gitter.im/ajv-validator/ajv?at=58f484c208c00c092a8a5787 - 不確定它是同一問題,雖然 – esp

+0

我沒有按照您的方式閱讀json模式規範。我認爲模式是正確的。您對模式的「更正」意味着任何json都是有效的 –

+0

我正在跟進https://groups.google.com/forum/#!forum/json-schema。隨意加入那裏 –

回答

0

模式有效。我推薦一個不同的在線驗證器,以正確處理$ref關鍵字。我的建議是https://jsonschemalint.com(儘管它錯誤地使用了「lint」一詞)。它由AJV支持,所以你可以確定它是正確的。

爲了公平對待www.jsonschemavalidator.net,這是一個非常奇怪的使用$ref。這在技術上不是錯誤的,但這是不尋常的。我對模式作者的建議是將內聯頂層$ref。將會有更多的驗證器可以正確處理它。

回到在線驗證問題,即使有一個好的驗證器,它也不會起作用。如果你嘗試用https://jsonschemalint.com病人架構,你的錯誤

無法解決參考DomainResource#/定義/ DomainResource從ID http://hl7.org/fhir/json-schema/Patient#

的問題是,病人架構引用的一個模式一個不同的文檔驗證器不能或不會獲取。如果你解決$ref針對id,你會得到你需要的模式的URI,但我知道沒有這樣做的在線驗證器。根據JSON模式規範,這不是您可以依賴的行爲。

另一個選項是一個在線驗證器,允許您指定多個模式。但是,我還沒有看到有這個功能的。

如果在線驗證非常重要,那麼您可能需要自行設置專門用於驗證這些模式的內容。這很容易做到。希望你甚至將它公開,以便其他人也能受益。

+0

我想使用jsonschema與AJV進行數據驗證,但我得到「最大調用堆棧大小超過」錯誤。可能是因爲自我引用。有解決方案來解決這個問題?謝謝 – Pietro