JSON Черновик схемы v7 - определение дополнительных свойств перечисления на основе общего выбора типа перечисления - тестирование в XMLSpy Pro 2020 - PullRequest
1 голос
/ 02 марта 2020

Я пытаюсь определить схему json, которая имеет общий тип перечисления для ряда объектов, а затем в зависимости от того, какое перечисление выбрано, определить возможные комбинации перечислений, а также дополнительные необходимые элементы. В примере есть FurnitureData с {IDNumber, Color, Furniture Type}, а затем в зависимости от типа, выбранного из списка перечислений, получает функцию, назначенную с различными перечислениями. Я также добавил в качестве дополнительного элемента пример «Персона назначена».

Я думаю, что я сделал это правильно, используя anyof и const. Но когда я тестирую с XMLSpy Pro 2020, он генерирует недопустимые json примеры, а также, когда я пытаюсь проверить недопустимый пример, он проходит .... так, 1) хорошо ли я express? 2) что я делаю не так? 3) есть ли лучший способ? 4) Это инструмент или схема json? Пожалуйста, помогите.


JSON Schema :

{
    "$schema": "http://json-schema.org/draft-07/schema#",
    "description": "Comment describing your JSON Schema",
    "type": "object",
    "properties": {
        "FurnitureData": {
            "type": "array",
            "items": {
                "type": "object",
                "properties": {
                    "IDNumber": {
                        "type": "object",
                        "description": "Unique identifier",
                        "required": [
                            "value"
                        ],
                        "properties": {
                            "value": {
                                "type": "string",
                                "maxLength": 16
                            },
                            "readOnly": {
                                "type": "boolean",
                                "default": true
                            }
                        }
                    },
                    "Color": {
                        "type": "object",
                        "description": "Preferred color",
                        "required": [
                            "value"
                        ],
                        "properties": {
                            "value": {
                                "type": "string",
                                "default": "WOOD",
                                "enum": [
                                    "BLUE",
                                    "WOOD",
                                    "GREEN"
                                ]
                            },
                            "custom value": {
                                "type": "string",
                                "maxLength": 32
                            }
                        }
                    },
                    "Furniture Type": {
                        "type": "object",
                        "description": "Kind of Furniture",
                        "required": [
                            "value"
                        ],
                        "properties": {
                            "value": {
                                "type": "string",
                                "default": "CHAIR",
                                "enum": [
                                    "LAMP",
                                    "TABLE",
                                    "CHAIR"
                                ]
                            },
                            "custom value": {
                                "type": "string",
                                "maxLength": 32
                            }
                        }
                    }
                },
                "required": [
                    "IDNumber",
                    "Color",
                    "Furniture Type"
                ],
                "anyOf": [
                    {
                        "properties": {
                            "Furniture Type": {
                                "value": {
                                    "const": "LAMP"
                                }
                            },
                            "Function": {
                                "type": "object",
                                "description": "Lighting arrangement",
                                "required": [
                                    "value"
                                ],
                                "properties": {
                                    "value": {
                                        "type": "string",
                                        "enum": [
                                            "LIGHT ON",
                                            "LIGHT OFF"
                                        ]
                                    }
                                }
                            }
                        },
                        "required": [
                            "Furniture Type",
                            "Function"
                        ]
                    },
                    {
                        "properties": {
                            "Furniture Type": {
                                "value": {
                                    "const": "TABLE"
                                }
                            },
                            "Function": {
                                "type": "object",
                                "description": "Size of table",
                                "required": [
                                    "value"
                                ],
                                "properties": {
                                    "value": {
                                        "type": "string",
                                        "enum": [
                                            "3' x 4'",
                                            "6' x 4'",
                                            "12' x 4'",
                                            "10' round"
                                        ]
                                    }
                                }
                            }
                        },
                        "required": [
                            "Furniture Type",
                            "Function"
                        ]
                    },
                    {
                        "properties": {
                            "Furniture Type": {
                                "value": {
                                    "const": "CHAIR"
                                }
                            },
                            "Function": {
                                "type": "object",
                                "description": "Planned use",
                                "required": [
                                    "value"
                                ],
                                "properties": {
                                    "value": {
                                        "type": "string",
                                        "enum": [
                                            "WORKSPACE SEAT",
                                            "SPARE SEAT"
                                        ]
                                    }
                                }
                            },
                            "Person assigned": {
                                "type": "object",
                                "description": "Seating assignment",
                                "required": [
                                    "value"
                                ],
                                "properties": {
                                    "value": {
                                        "type": "string"
                                    }
                                }
                            }
                        },
                        "required": [
                            "Furniture Type",
                            "Function",
                            "Person assigned"
                        ]
                    }
                ]
            }
        }
    },
    "required": [
        "FurnitureData"
    ]
}

Invalid JSON Пример того, что XMLSpy проверяется как нормально: (он связан с моей схемой на информационной странице) Лампы не должны разрешать 6x4 как функцию. ..

{
    "FurnitureData": [
        {
            "Color": {
                "value": "WOOD",
                "readOnly": "a",
                "custom value": "a"
            },
            "IDNumber": {
                "value": "a",
                "readOnly": true
            },
            "Furniture Type": {
                "value": "LAMP",
                "custom value": "a"
            },
            "Function": {
                "value": "6' x 4'",
                "custom value": "a"
            }
        }
    ]
}

Еще один неверный пример ... На стульях указано «Назначено лицо», и отображается неверное значение типа, но это также подтверждает ...

{
    "FurnitureData": [
        {
            "Color": {
                "value": "WOOD",
                "readOnly": "a",
                "custom value": "a"
            },
            "IDNumber": {
                "value": "a",
                "readOnly": true
            },
            "Furniture Type": {
                "value": "CHAIR",
                "custom value": "a"
            },
            "Function": {
                "value": "6' x 4'",
                "custom value": "a"
            }
        }
    ]
}

Это выполняет рекомендации в См. раздел enum, используя anyof

Может быть, я должен использовать конструкцию if-then? Здесь я попробовал использовать if-then в any-of, но я также получил проверки json, которые позволяют перечисления из других типов мебели ...

{
    "$schema": "http://json-schema.org/draft-07/schema#",
    "description": "Comment describing your JSON Schema",
    "type": "object",
    "properties": {
        "FurnitureData": {
            "type": "array",
            "items": {
                "type": "object",
                "properties": {
                    "IDNumber": {
                        "type": "object",
                        "description": "Unique identifier",
                        "required": [
                            "value"
                        ],
                        "properties": {
                            "value": {
                                "type": "string",
                                "maxLength": 16
                            },
                            "readOnly": {
                                "type": "boolean",
                                "default": true
                            }
                        }
                    },
                    "Color": {
                        "type": "object",
                        "description": "Preferred color",
                        "required": [
                            "value",
                            "readOnly"
                        ],
                        "properties": {
                            "value": {
                                "type": "string",
                                "default": "WOOD",
                                "enum": [
                                    "BLUE",
                                    "WOOD",
                                    "GREEN"
                                ]
                            },
                            "custom value": {
                                "type": "string",
                                "maxLength": 32
                            }
                        }
                    },
                    "Furniture Type": {
                        "type": "object",
                        "description": "Kind of Furniture",
                        "required": [
                            "value"
                        ],
                        "properties": {
                            "value": {
                                "type": "string",
                                "default": "CHAIR",
                                "enum": [
                                    "LAMP",
                                    "TABLE",
                                    "CHAIR"
                                ]
                            },
                            "custom value": {
                                "type": "string",
                                "maxLength": 32
                            }
                        }
                    }
                },
                "required": [
                    "IDNumber",
                    "Color",
                    "Furniture Type"
                ],
                "anyOf": [
                    {
                        "if": {
                            "properties": {
                                "Furniture Type": {
                                    "value": {
                                        "const": "LAMP"
                                    }
                                }
                            }
                        },
                        "then": {
                            "properties": {
                                "Function": {
                                    "type": "object",
                                    "description": "Lighting arrangement",
                                    "required": [
                                        "value"
                                    ],
                                    "properties": {
                                        "value": {
                                            "type": "string",
                                            "enum": [
                                                "LIGHT ON",
                                                "LIGHT OFF"
                                            ]
                                        }
                                    }
                                }
                            },
                            "required": [
                                "Function"
                            ]
                        }
                    },
                    {
                        "if": {
                            "properties": {
                                "Furniture Type": {
                                    "value": {
                                        "const": "TABLE"
                                    }
                                }
                            }
                        },
                        "then": {
                            "properties": {
                                "Function": {
                                    "type": "object",
                                    "description": "Size of table",
                                    "required": [
                                        "value"
                                    ],
                                    "properties": {
                                        "value": {
                                            "type": "string",
                                            "enum": [
                                                "3' x 4'",
                                                "6' x 4'",
                                                "12' x 4'",
                                                "10' round"
                                            ]
                                        }
                                    }
                                }
                            },
                            "required": [
                                "Function"
                            ]
                        }
                    },
                    {
                        "if": {
                            "properties": {
                                "Furniture Type": {
                                    "value": {
                                        "const": "CHAIR"
                                    }
                                }
                            }
                        },
                        "then": {
                            "properties": {
                                "Function": {
                                    "type": "object",
                                    "description": "Planned use",
                                    "required": [
                                        "value"
                                    ],
                                    "properties": {
                                        "value": {
                                            "type": "string",
                                            "enum": [
                                                "WORKSPACE SEAT",
                                                "SPARE SEAT"
                                            ]
                                        }
                                    }
                                },
                                "Person assigned": {
                                    "type": "object",
                                    "description": "Seating assignment",
                                    "required": [
                                        "value"
                                    ],
                                    "properties": {
                                        "value": {
                                            "type": "string"
                                        }
                                    }
                                }
                            },
                            "required": [
                                "Function",
                                "Person assigned"
                            ]
                        }
                    }
                ]
            }
        }
    },
    "required": [
        "FurnitureData"
    ]
}

1 Ответ

1 голос
/ 02 марта 2020

Значения JSON Схема properties объекта являются подсхемами (JSON Схемы сами по себе).

Зная это, если вы берете свою подсхему на properties.FurnitureData.anyOf[1].properties['Furniture Type'], и вы берете что как схема ... она на самом деле не express никаких ограничений.

Подсхема в этом месте из вашей схемы ...

{
  "value": {
    "const": "TABLE"
  }
}

, тогда как она должна быть ...

{
  "properties":{
    "value": {
      "const": "TABLE"
    }
  }
}

Самый простой способ отладить проблему такого рода - проверить свои предположения.

Вы предполагали, что allOf[1] и allOf[2] не пройдут, поэтому замените эти подсхемы на false (логические значения являются действительными схемами).

При этом вы обнаружите, что предположение неверно, и allOf[1] допустимо. Конечно, вы ожидаете, что const будет выбран, и, следовательно, эта подсхема потерпит неудачу, но он не будет выбран, потому что вы пропустили properties и value не является допустимым JSON ключевым словом схемы.

Вы можете запускать такие быстрые тесты, используя https://jsonschema.dev/s/Xt1Yi

...