web-dev-qa-db-ja.com

$ refの使用に関するJSONスキーマ

$ 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は、ルートに移動し、そのスキーマに到達するまでパスをたどることによって機能しますか?ありがとう!

30
hunterc

OK:各$refは完全なURIに解決されます。それが完了すると、質問をすることですべての質問に答えられます:単にそのURIを取得した場合、どのスキーマになりますか?$refはどこに、どのようにロードされたか、それはすべて無関係です-解決されたURIに完全に依存する.

ライブラリmightはいくつかのショートカットを使用します(ドキュメントを1回だけ取得するか、1つのスキーマを信頼して別のスキーマを「話す」など)。すべての実装の詳細。

元の質問への応答:

#は特別ではありません:$refのすべての値は、現在のドキュメント(または"id"の最も近い値(存在する場合))に対するURIとして解決されます。

したがって、"id"を使用していない場合、#はスキーマドキュメントのルートを指します。 http://example.com/schemaからスキーマをフェッチした場合、その中の{"$ref": "#"}anywherehttp://example.com/schema#に解決され、文書そのものです。

"id"を使用する場合は異なります。これは、$refが解決される「ベース」スキーマを変更するためです。

{
    "type": "array",
    "items": {
        "id": "http://example.com/item-schema",
        "type": "object",
        "additionalProperties": {"$ref": "#"}
    }
}

その例では、$refhttp://example.com/item-schema#に解決されます。 JSONスキーマのセットアップがすでに持っているスキーマを信頼している場合、「items」の値を再利用できます。

ただし、ポイントは#について特別なものはないということです。他のURIと同様にURIに解決されるだけです。

編集1への応答:

最初の例は正しいです。

ただし、残念ながら2番目はそうではありません。これは、フラグメント解決がURIで機能する方法が原因です。1つのフラグメントが完全に別のフラグメントを置き換えます#"id"の値に対して#/itemsを解決するとき、再び#/itemsにならない-#になります。したがって、2番目の例では、"anyOf"の最初のエントリは、最初の例と同様にドキュメントのルートに解決されます。

編集2への応答:

ドキュメントがhttp://example.com/my-schemaからロードされると仮定すると、2つの$refsの完全なURIは次のとおりです。

  • http://example.com/itemSchema#
  • http://example.com/itemSchema#/definitions/schemaArray

最初のライブラリでは、ライブラリmayが既に持っているスキーマを使用しますが、そうでない可能性があります-結局、http://example.com/my-schemahttp://example.com/itemSchema

2つ目は、「itemSchema」に"definitions"セクションがないため、$refがまったく適切に解決されないため、機能しません。

35
cloudfeet