Python JSON проверка схемы для массива объектов - PullRequest
1 голос
/ 10 июля 2020

Я пытаюсь проверить файл JSON, используя схему, указанную ниже, я могу ввести любые дополнительные поля, я не понимаю, что я делаю не так и почему, пожалуйста?

Образец JSON Данные

{
    "npcs":
    [
        {
            "id": 0,
            "name": "Pilot Alpha",
            "isNPC": true,
            "race": "1e",
            "testNotValid": false
        },
        {
            "id": 1,
            "name": "Pilot Beta",
            "isNPC": true,
            "race": 1
        }
    ]
}

JSON Схема

Я установил "required" и "additionalProperties", поэтому я подумал, что проверка не удастся. ....

FileSchema = {
    "definitions":
    {
        "NpcEntry":
        {
            "properties":
            {
                "id": { "type": "integer" },
                "name": { "type" : "string" },
                "isNPC": { "type": "boolean" },
                "race": { "type" : "integer" }
            },
            "required": [ "id", "name", "isNPC", "race" ],
            "additionalProperties": False
        }
    },

    "type": "object",
    "required": [ "npcs" ],
    "additionalProperties": False,
    "properties": 
    {
        "npcs":
        {
            "type": "array",
            "npcs": { "$ref": "#/definitions/NpcEntry" }
        }
    }
}

Файл и схема JSON обрабатываются с использованием пакета jsonschema для Python, (я использую python 3.7 на Ma c).

Метод, который я использую для чтения и проверки, приведен ниже. Я удалил большую часть общей проверки, чтобы сделать код максимально коротким и удобным для использования:

import json
import jsonschema

def _ReadJsonfile(self, filename, schemaSystem, fileType):

    with open(filename) as fileHandle:
        fileContents = fileHandle.read()
 
    jsonData = json.loads(fileContents)

    try:
        jsonschema.validate(instance=jsonData, schema=schemaSystem)

    except jsonschema.exceptions.ValidationError as ex:
        print(f"JSON schema validation failed for file '{filename}'")
        return None

    return jsonData

1 Ответ

3 голосов
/ 11 июля 2020

at: "npcs": { "$ref": "#/definitions/NpcEntry" }

замените «npcs» на «items». npcs не является допустимым ключевым словом, поэтому игнорируется. Единственная проверка, которая происходит на верхнем уровне, проверяет, что данные являются объектом, а свойство one - массивом.

...