я могу сделать patternProperties с проверкой $ ref - PullRequest
0 голосов
/ 01 июня 2018

Я пытаюсь сопоставить patternProperties со схемой, например, вот текст jsonschema:

{
"$schema": "http://json-schema.org/draft-04/schema#",
"definitions": {
    "fabric_id": {
        "enum": [
            "ADMIN",
            "COPPER",
            "NETWORK",
            "STORAGE",
            "STORAGE2",
            "TENANT"
        ]
    },
    "fabrics": {
        "additionalProperties": false,
        "patternProperties": {
            "[A-Z0-9-]*": {
                "additionalProperties": false,
                "properties": {
                    "description": {
                        "type": "string"
                    },
                    "fabric_id": {
                        "$ref": "#/definitions/fabric_id",
                        "type": "string"
                    }
                },
                "required": [
                    "description",
                    "fabric_id"
                ],
                "type": "object"
            }
        },
        "type": "object"
    }
},
"description": "fabrics spec",
"properties": {
    "fabrics": {
        "$ref": "#/definitions/fabrics"
    }
},
"required": [
    "fabrics"
],
"title": "network fabric",
"type": "object"

}

и вот мой входной файл json:

{
"fabrics": {
    "ADMIN": {
        "description": "Primary bonded pair on the bigswitches.",
        "fabric_id": "ADMIN"
    },
    "COPPER": {
        "description": "Primary IPMI fabric on the tor switches.",
        "fabric_id": "COPPER"
    }
}

}

Я не могу понять, как проверить patternProperty по перечислению fabric_id?В объекте pattern есть fabric_id, и он может ссылаться на перечисление fabric_id в разделе определений.Мне бы хотелось иметь тот же $ ref для шаблона «[A-z0-9 -] *», но я просто не могу заставить его работать.Это возможно?

Ответы [ 2 ]

0 голосов
/ 03 июня 2018

Эта схема - лучшее, что вы можете сделать.Единственное, что он не может сделать, это ограничить имя свойства значением «fabric_id».К сожалению, это невозможно с JSON Schema.

{
  "$schema": "http://json-schema.org/draft-06/schema#",
  "type": "object",
  "properties": {
    "fabrics": { "$ref": "#/definitions/fabrics" }
  },
  "required": ["fabrics"],
  "definitions": {
    "fabric_id": {
      "enum": ["ADMIN", "COPPER", "NETWORK"]
    },
    "fabrics": {
     "type": "object",
     "propertyNames": { "$ref": "#/definitions/fabric_id" },
     "patternProperties": {
        ".*": {
          "type": "object",
          "properties": {
            "description": { "type": "string" },
            "fabric_id": { "$ref": "#/definitions/fabric_id" }
          },
          "required": ["description", "fabric_id"]
        }
      }
    }
  }
}
0 голосов
/ 01 июня 2018

К сожалению, я не верю, что это возможно с черновиком 4 схемы JSON.

Если вы можете обновить до 6 или 7 (+), вы можете сделать это возможным.

propertyNames: https://tools.ietf.org/html/draft-handrews-json-schema-validation-01#section-6.5.8

Если экземпляр является объектом, это ключевое слово проверяется, если каждое имя свойства в экземпляре проверяется на соответствие предоставленной схеме.Обратите внимание, что имя свойства, которое проверяет схема, всегда будет строкой.

Пример того, как это можно использовать, можно найти по адресу https://github.com/json-schema-org/json-schema-org.github.io/issues/77

...    
"fooProperties": {
                "propertyNames": {
                    "$comment": "Need to anyOf these or else the enum and pattern conflict",
                    "anyOf": [
                        {"enum": ["foo1", "foo2"]},
                        {"pattern": "foo[A-Z][a-z0-9]*"}
                    ]
                }
            },
...

Извините, яу меня нет времени на обновление схемы, чтобы следовать этому, но, надеюсь, я достаточно объяснил это, чтобы вы могли ее адаптировать.

, если вы не можете перейти за черновик-4 ... хорошо, у вас будетсделать этот аспект проверки вручную вне схемы JSON.

...