web-dev-qa-db-ja.com

jsonスキーマ配列で必要な設定

オブジェクトのjsonスキーマ配列にrequiredを設定する方法を理解しようとしています。 requiredプロパティは、配列ではなくオブジェクトで正常に機能します。

これが私のjsonスキーマの項目の一部です。

        "items": {
        "type": "array",
        "properties": {
            "item_id": {"type" : "number"},
            "quantity": {"type": "number"},
            "price": {"type" : "decimal"},
            "title": {"type": "string"},
            "description": {"type": "string"}
        },
        "required": ["item_id","quantity","price","title","description"],
        "additionalProperties" : false
    }

これが私が送信しているjson配列です。これらの項目で説明を渡していないため、json検証は失敗するはずです。

       "items": [
        {
            "item_id": 1,
            "quantity": 3,
            "price": 30,
            "title": "item1 new name"
        },
        {
            "item_id": 1,
            "quantity": 16,
            "price": 30,
            "title": "Test Two"
        }
    ]
15
ipengineer

this validator を使用して、itemsという名前のオブジェクト内の配列要素のスキーマの一部をネストすることで機能しました。スキーマには2つのネストされたitemsフィールドがありますが、それはJSONSchemaのキーワードと、JSONに実際にitemsというフィールドがあるためです。

JSONSchema:

{
   "type":"object",
   "properties":{
      "items":{
         "type":"array",
         "items":{
            "properties":{
               "item_id":{
                  "type":"number"
               },
               "quantity":{
                  "type":"number"
               },
               "price":{
                  "type":"number"
               },
               "title":{
                  "type":"string"
               },
               "description":{
                  "type":"string"
               }
            },
            "required":[
               "item_id",
               "quantity",
               "price",
               "title",
               "description"
            ],
            "additionalProperties":false
         }
      }
   }
}

JSON:

{
   "items":[
      {
         "item_id":1,
         "quantity":3,
         "price":30,
         "title":"item1 new name"
      },
      {
         "item_id":1,
         "quantity":16,
         "price":30,
         "title":"Test Two"
      }
   ]
}

説明フィールドの欠落に関する2つのエラーの出力:

[ {
  "level" : "error",
  "schema" : {
    "loadingURI" : "#",
    "pointer" : "/properties/items/items"
  },
  "instance" : {
    "pointer" : "/items/0"
  },
  "domain" : "validation",
  "keyword" : "required",
  "message" : "missing required property(ies)",
  "required" : [ "description", "item_id", "price", "quantity", "title" ],
  "missing" : [ "description" ]
}, {
  "level" : "error",
  "schema" : {
    "loadingURI" : "#",
    "pointer" : "/properties/items/items"
  },
  "instance" : {
    "pointer" : "/items/1"
  },
  "domain" : "validation",
  "keyword" : "required",
  "message" : "missing required property(ies)",
  "required" : [ "description", "item_id", "price", "quantity", "title" ],
  "missing" : [ "description" ]
} ]

上記を here に貼り付けて、同じ出力が生成されることを確認してください。

21
theon

多分あなたのバリデータはJSONSchema v3のみをサポートしていますか?

requiredの動作方法は、v3とv4の間で変更されました。

7
theon

これは古いスレッドであることに気づきましたが、この質問はjsonschema.netからリンクされているため、次の点に注目する価値があると思いました...

元の例の問題は、配列の「アイテム」を宣言するのではなく、「配列」タイプの「プロパティ」を宣言してから、配列に入力する「オブジェクト」タイプ(「プロパティ」を使用)を宣言することです。元のスキーマスニペットの改訂版は次のとおりです。

"items": {
    "type": "array",
    "items": {
        "type": "object",
        "properties": {
            "item_id": {"type" : "number"},
            "quantity": {"type": "number"},
            "price": {"type" : "decimal"},
            "title": {"type": "string"},
            "description": {"type": "string"}
        },
        "required": ["item_id","quantity","price","title","description"],
        "additionalProperties" : false
    }
}

混乱を避けるために、配列の名前に「項目」という用語を使用しないことをお勧めしますが、それを妨げるものは何もありません...

6
Greg Stumph