17

次のJSONスキーマがあるとしましょう

{
 "name":"Product",
 "type":"object",
 "properties":{
   "id":{
     "type":"number",
     "required":true
   },
   "name":{
     "description":"Name of the product",
     "required":true
   },
   "price":{
     "required":true,
     "type": "number",
     "minimum":0,
     "required":true
   },
   "tags":{
     "type":"array",
     "items":{
       "type":"any"
     }
   }
 }
}

しかし、タグを配列にする代わりに、ルート スキーマの一部にしたいと考えています。したがって、任意のプロパティを指定できますが、「id」、「name」、および「price」に特に注意を払います。次のうちどれが正しい方法で、どれが完全に間違っていますか?

{
 "name":"Product",
 "type":"object",
 "properties":{
   "id":{
     "type":"number",
     "required":true
   },
   "name":{
     "description":"Name of the product",
     "required":true
   },
   "price":{
     "required":true,
     "type": "number",
     "minimum":0,
     "required":true
   }
 },
 "additionalProperties": {
     "type":"any"
 }
}

{
 "name":"Product",
 "type":"object",
 "properties":{
   "id":{
     "type":"number",
     "required":true
   },
   "name":{
     "description":"Name of the product",
     "required":true
   },
   "price":{
     "required":true,
     "type": "number",
     "minimum":0,
     "required":true
   }
 },
 "extends": {
     "type":"any"
 }
}

{
 "name":"Product",
 "type":["object","any"],
 "properties":{
   "id":{
     "type":"number",
     "required":true
   },
   "name":{
     "description":"Name of the product",
     "required":true
   },
   "price":{
     "required":true,
     "type": "number",
     "minimum":0,
     "required":true
   }
 }
}

他にもいくつか思いつきますが (「any」と「object」の役割を逆にするなど)、これらはすべてこれら 3 つの例から派生したものです。

4

1 に答える 1

35

[免責事項: 次の JSON スキーマ検証仕様の作成者はこちら]

OK、あなたが何を求めているのかは不明です。以下を参照してください。しかし、あなたの例の1つは明らかにあなたが望むことをしていません。

{ "type": [ "object", "any" ] }

これは空のスキーマと同等であり、すべてのインスタンスを検証します。

あなたの質問を私が読む 1 つの方法は、JSON データをタグ配列または少なくともidnameおよびという名前のメンバーを持つオブジェクトのいずれかにすることpriceです。ドラフト v3 を使用しているように見えるため、解決策は 1 つしかありません。

{
    "type": [
        {
            "description": "schema for tags array here",
        },
        {
            "description": "schema for the base object here"
        }
    ]
}

この構造は、インスタンスが内部で少なくとも 1 つのスキーマに従わなければならないことを意味しますtype(また、プリミティブ型と混在させることもできます)。

ただし、現在のドラフトは現在 v4 であるため、次のように記述する必要があります。

{
    "anyOf": [
        {
            "description": "schema for tags array here",
        },
        {
            "description": "schema for the base object here"
        }
    ]
}

すべての実装がドラフト v4 または上記の構成をサポートしているわけではないことに注意してくださいtype。実際、そうする人はほとんどいません。両方をサポートするオンライン スキーマ バリデーターへのリンクについては、以下を参照してください。

私があなたの質問を読んだ別の方法は、 以外のプロパティを許可しid、それらが好きなものにnameなりたいということですprice。これは非常に簡単です。tagsinのスキーマを定義しないでくださいproperties:

{
    "type": "object",
    "required": [ "id", "name", "price" ]
    "properties": {
        "id": {
            "type": "number"
        },
        "name": {
            "description": "Name of the product"
        },
        "price": {
            "type": "number",
            "minimum": 0
        }
    }
}

additionalPropertiesbeing として指定しないためfalse、オブジェクト インスタンスは任意の数の追加メンバーを持つことができ、これらのメンバーは何でもかまいません。

スキーマをテストできるオンライン バリデーターへのリンク:こちら

于 2013-01-28T05:24:56.003 に答える