2017-03-26 30 views
0

我想正確解決更復雜的JSON模式,它們有引用。然而,id屬性給了我很多麻煩,並且我不清楚它是如何從文檔中工作的。這裏有事情,我還是不明白:JSON模式v4的id屬性

  • 被限制的URI("id": "http://some.site/my/schema.json")id屬性,也可以一塊架構具有任意ID("id": "foo")?
  • id屬性是分層的嗎?如果一個父模式的id爲foo(我認爲id不限於URis)並且孩子有bar,那麼引用該孩子的正確方法是foo/bar?還是ids完全獨立?
  • 有沒有辦法清楚地告訴$ref是否引用id的一個模式?

回答

1

"id"是一個URI。它可以是相對或絕對URI。如果它是相對的,那麼它將根據父解析範圍進行解析。如果它是絕對的,那麼它不受父範圍的影響。

這些考慮

所以,記住

一),它可以是一個「arbitary ID」,但它會被解釋爲相對URI

b)是 - 相對URI的分辨率發生針對父範圍

C)空"$ref"會做

一兩件事,該規範並沒有告訴你是做什麼,如果頂層URI是相對URI - 會是什麼解決反對。它可以是實現相關的。

作爲一個最佳實踐,我建議您只在頂層使用一個"id",並使所有$ ref都與此相關(除非您有充分的理由以其他方式)。

+0

偉大的總結,謝謝!但是'c'是什麼意思 - 一個空的'$ ref'會做到這一點?這個問題的意思是,當試圖解決'$ ref'時,有沒有辦法清楚地判斷它是否通過id引用?但由於它必須是一個URI,我猜不是...... –

+0

「有沒有辦法清楚地告訴它是否通過id引用」 如果它是一個相對URI,那麼它將根據作用域ID進行解析。如果它是絕對的,那麼範圍不會影響它。如果它是相對的並且沒有父範圍,那麼你可以假設它將根據當前文檔的URI進行解析(噹噹前文檔以未知方式加載時(如程序化構造)時會出現一些不一致)。當我們使用片段標識符(如「$ ref」:「#/ definitions/Whatever」)時,這種情況大多發生,其中#表示當前文檔的根。 – erosb

+0

太好了,謝謝! –