web-dev-qa-db-ja.com

任意のキーのJSONスキーマをどのように設計しますか?

次のJSON出力データがあります。

{
   "label_name_0" : 0,
   "label_name_5" : 3,
   .
   .
   .
   "label_name_XXX" : 4
}

出力は単純です。整数値に関連付けられたkey [1]名です。キー名が変更されない場合は、次のようなJSONスキーマを簡単に思い付くことができます。

    {
        "type": "array"
        "title": "Data output",
        "items" :{ 
            "properties": {
                "label_name": {
                   "type": "integer",
                   "default": 0,
                   "readonly": True,
            }
        }
    },

キー名自体は不明であり、変更され続けるため、スキーマを設計する必要があります。私が知っている唯一のことは、キーはstringであり、100文字以下であるということです。キーのJSONスキーマを定義するにはどうすればよいですかlable_name_xxxそれは変化し続けます。

[1]正しい用語を使用しているかどうかわからない

32
Cory

Json-schema.orgでは、 高度な例 セクションに適切なものがあります。 patternProperties内にobjectを定義できます。

{
    "type": "object",
    "properties": {
        "/": {}
    },
    "patternProperties": {
        "^(label_name_[0-9]+)+$": { "type": "integer" }
    },
    "additionalProperties": false,
 }

正規表現(label_name_[0-9]+)+はニーズに合うはずです。 JSONスキーマでは、正規表現は^および$で明示的に固定されています。正規表現は、少なくとも1つのプロパティ(+)が必要であることを定義しています。プロパティは、label_name_0から9までの数字で構成されますが、少なくとも1つの数字([0-9]+)が必要ですが、任意の数にすることもできます。

additionalPropertiesfalseに設定すると、オブジェクトのプロパティが正規表現に一致するように制約されます。

31
Konrad Reiche

Konradの回答が述べているように、patternPropertiesを使用します。ただし、不要なpropertiesの代わりに使用してください。コンラッドは、/で始まるパスを期待していた参照例から貼り付けたばかりだと思います。以下の例では、パターンマッチregex .*は任意のプロパティ名を受け入れ、"additionalProperties": falseを使用することによってのみ文字列またはnullのタイプを許可しています。

  "patternProperties": {
    "^.*$": {
      "anyOf": [
        {"type": "string"},
        {"type": "null"}
      ]
    }
  },
  "additionalProperties": false
13