2017-08-21 44 views
0

我有這樣的JSON:

{ 
    "categories": [ 
    { 
     "id": 1, 
     "name": "cat1", 
     "topics": [ 
     { 
      "$ref": "#/topics/1" 
     } 
     ] 
    } 
    ], 
    "topics": [ 
    { 
     "id": 1, 
     "name": "top1" 
    } 
    ] 
} 

而且我已經寫了下面的模式來驗證它:

{ 
    "definitions": { 
    "category": { 
     "type": "object", 
     "properties": { 
      "id": { 
      "type": "integer" 
      }, 
      "name": { 
      "type": "string" 
      }, 
      "topics": { 
      "type": "array" 
      "items": { "$ref": "#/definitions/topic" } 
      } 
     } 
     }, 
     "topic": { 
     "type": "object", 
     "properties": { 
      "id": { 
      "type": "integer" 
      }, 
      "name": { 
      "type": "string" 
      } 
     } 
     } 
    }, 
    "type": "object", 
    "properties": { 
    "categories": { 
     "items": { "$ref": "#/definitions/category" }, 
     "type": "array" 
    }, 
    "topics": { 
     "items": { "$ref": "#/definitions/topic" }, 
     "type": "array" 
    } 
    } 
} 

當我使用這種模式在流行的在線驗證器上,它不會捕獲無效的引用,如#/topics/5#/ttt/555。 我可以使用此模式來驗證引用嗎?你能建議我圖書館或服務,可以做到嗎?

回答

1

當前這超出了JSON模式的範圍。 @erosb提到的提案仍在考慮之中,但對於即將到來的07版草案並不適用。如果有足夠的需求,可以考慮草案08。這將是項目範圍的一個重大擴展,這就是爲什麼它一直處於擱置狀態,而其他問題得到解決。

一些驗證器可以很容易地定義您自己的擴展關鍵字,這可能是一個很好的方法來做你想做的事情。肯定有庫會應用JSON指針,並讓你知道它是否指向任何東西。如果你在某個地方實施了@ erosb的建議,如果你可以評論這個問題並讓我們知道它是如何實現的,那將是非常好的。

1

我不知道我是否正確理解了你試圖達到的目標。我假設你想表示"topics"數組的項目應該是JSON引用(帶有JSON指針的"$ref"),並且尖括的對象應該與模式"#/definitions/topic"匹配。

如果是這樣的話,那麼目前沒有辦法用json schema來表達它,所以 - 即使是最新版本 - 你只能表示一個字符串應該是一個json指針,但是你不能限制引用對象的類型應該是什麼。

去年我made a suggestion解決這個問題,但由於混合反饋它有點卡住了。