13

たとえば、ファイル システムのスキーマの場合、ディレクトリにはファイルのリストが含まれます。スキーマは、ファイルの指定、次のサブタイプ「イメージ」、もう 1 つの「テキスト」で構成されます。

下部には、メイン ディレクトリ スキーマがあります。ディレクトリには、ファイルのサブタイプであるアイテムの配列であるプロパティ content があります。

基本的に私が探しているのは、検証対象の json オブジェクトのプロパティから "$ref" の値を検索するようにバリデーターに指示する方法です。

json の例:

{
    "name":"A directory",
    "content":[
        {
            "fileType":"http://x.y.z/fs-schema.json#definitions/image",
            "name":"an-image.png",
            "width":1024,
            "height":800
        }
        {
            "fileType":"http://x.y.z/fs-schema.json#definitions/text",
            "name":"readme.txt",
            "lineCount":101
        }
        {
            "fileType":"http://x.y.z/extended-fs-schema-video.json",
            "name":"demo.mp4",
            "hd":true
        }

    ]
}

「疑似」スキーマでは、「画像」と「テキスト」の定義は同じスキーマに含まれていますが、別の場所で定義されている可能性があることに注意してください。

{
    "id": "http://x.y.z/fs-schema.json",
    "definitions": {
        "file": {
            "type": "object",
            "properties": {
                "name": { "type": "string" },
                "fileType": {
                    "type": "string",
                    "format": "uri"
                }
            }
        },
        "image": {
            "allOf": [
            { "$ref": "#definitions/file" },
            {
                "properties": {
                    "width": { "type": "integer" },
                    "height": { "type": "integer"}
                }
            }
            ]
        },
        "text": {
            "allOf": [
            { "$ref": "#definitions/file" },
            { "properties": { "lineCount": { "type": "integer"}}}
            ]
        }
    },
    "type": "object",
    "properties": {
        "name": { "type": "string"},
        "content": {
            "type": "array",
            "items": {
                "allOf": [
                { "$ref": "#definitions/file" },
                { *"$refFromProperty"*: "fileType" } // the magic thing
                ]
            }
        }
    }
}
4

2 に答える 2

10

JSON スキーマの検証部分だけではこれを行うことはできません。これは固定構造を表しています。必要なものは、検証時にスキーマを解決/参照する必要があります。

rel="describedby"ただし、JSON ハイパースキーマとリンクを使用してこれを表現できます。

{
    "title": "Directory entry",
    "type": "object",
    "properties": {
        "fileType": {"type": "string", "format": "uri"}
    },
    "links": [{
        "rel": "describedby",
        "href": "{+fileType}"
    }]
}

したがって、ここでは値を取得し、"fileType"それを使用して関係「記述者」とのリンクを計算します。これは、「この場所のスキーマも現在のデータを記述している」ことを意味します。

問題は、ほとんどのバリデーターがリンク ("describeby" を含む) に注意を払わないことです。そうする「ハイパーバリデーター」を見つける必要があります。

更新: tv4ライブラリはこれを機能として追加しました

于 2013-10-17T11:35:48.423 に答える
3

cloudfeet の回答は有効な解決策だと思います。here で説明されているのと同じアプローチを使用することもできます。

定義するすべてのサブタイプを「anyOf」にすることができるファイルオブジェクトタイプがあります。各サブタイプを参照して検証できるようにするには、列挙型を使用します。

サブタイプのスキーマが同じ Json-Schema ファイルにある場合、"$ref" で明示的に uri を参照する必要はありません。正しいdraft4バリデーターは列挙値を見つけ、Json-Schemaツリーのその「サブスキーマ」に対して検証を試みます。

ドラフト 5 (進行中) では、"switch" ステートメントが提案されており、これにより、代替案をより明確な方法で表現できるようになります。

于 2013-10-17T18:38:35.753 に答える