$ refはjsonスキーマへのURIを使用して使用することを理解していますが、$ ref: "#"はどこを指しているのでしょうか?このブロックレベルで現在のスキーマを使用するという意味ですか?または、ルートレベルIDで定義されたルートレベルスキーマを使用することを意味しますか?ありがとう
編集:だから私が持っている場合:
"items": {
"anyOf": [
{ "$ref": "#" },
{ "$ref": "#/definitions/schemaArray" }
],
"default": {}
}
Idフィールドがないため、最初にルートスキーマを使用してインスタンスアイテムを検証しようとします。次に、定義スキーマで定義されたschemaArrayスキーマを使用して検証を試みます。
だから私はそれを変更した場合:
"items": {
"id" : "#/items",
"anyOf": [
{ "$ref": "#" },
{ "$ref": "#/definitions/schemaArray" }
],
"default": {}
}
次に、anyOf配列の最初のサブスキーマは、アイテムスキーマ自体を指しますか?
編集#2:わかりましたので、私が持っていた場合:
"items": {
"id" : "itemSchema",
"anyOf": [
{ "$ref": "#" },
{ "$ref": "#/definitions/schemaArray" }
],
"default": {}
}
そして
"stringArray": {
"type": "array",
"items": { "$ref" : "itemSchema" },
"minItems": 1,
"uniqueItems": true
}
「stringArray」の「items」フィールドは、上記の「itemsSchema」に対して検証されますか?
また、 'anyOf'の2番目の$ refは、ルートに移動し、そのスキーマに到達するまでパスをたどることによって機能しますか?ありがとう!
OK:各$ref
は完全なURIに解決されます。それが完了すると、質問をすることですべての質問に答えられます:単にそのURIを取得した場合、どのスキーマになりますか?$ref
はどこに、どのようにロードされたか、それはすべて無関係です-解決されたURIに完全に依存する.
ライブラリmightはいくつかのショートカットを使用します(ドキュメントを1回だけ取得するか、1つのスキーマを信頼して別のスキーマを「話す」など)。すべての実装の詳細。
#
は特別ではありません:$ref
のすべての値は、現在のドキュメント(または"id"
の最も近い値(存在する場合))に対するURIとして解決されます。
したがって、"id"
を使用していない場合、#
はスキーマドキュメントのルートを指します。 http://example.com/schema
からスキーマをフェッチした場合、その中の{"$ref": "#"}
anywhereはhttp://example.com/schema#
に解決され、文書そのものです。
"id"
を使用する場合は異なります。これは、$ref
が解決される「ベース」スキーマを変更するためです。
{
"type": "array",
"items": {
"id": "http://example.com/item-schema",
"type": "object",
"additionalProperties": {"$ref": "#"}
}
}
その例では、$ref
はhttp://example.com/item-schema#
に解決されます。 JSONスキーマのセットアップがすでに持っているスキーマを信頼している場合、「items」の値を再利用できます。
ただし、ポイントは#
について特別なものはないということです。他のURIと同様にURIに解決されるだけです。
最初の例は正しいです。
ただし、残念ながら2番目はそうではありません。これは、フラグメント解決がURIで機能する方法が原因です。1つのフラグメントが完全に別のフラグメントを置き換えます。 #
の"id"
の値に対して#/items
を解決するとき、再び#/items
にならない-#
になります。したがって、2番目の例では、"anyOf"
の最初のエントリは、最初の例と同様にドキュメントのルートに解決されます。
ドキュメントがhttp://example.com/my-schema
からロードされると仮定すると、2つの$ref
sの完全なURIは次のとおりです。
http://example.com/itemSchema#
http://example.com/itemSchema#/definitions/schemaArray
最初のライブラリでは、ライブラリmayが既に持っているスキーマを使用しますが、そうでない可能性があります-結局、http://example.com/my-schema
はhttp://example.com/itemSchema
。
2つ目は、「itemSchema」に"definitions"
セクションがないため、$ref
がまったく適切に解決されないため、機能しません。