создайте Ref-resolver из $ ref в jsonschema в python draft7 - PullRequest
0 голосов
/ 31 марта 2020

У меня есть json Схема

{
  "$id": "d:/documents/schemaFiles/WLWorkProduct/1",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "title": "WLWorkProduct",
  "description": "",
  "type": "object",
  "properties": {
    "RID": {
      "description": "resource type.",
      "type": "string"
    },
    "Data": {
      "type": "object",
      "properties": {
        "IndividualTypeProperties": {
          "allOf": [
            {
              "$ref": "d:/documents/schemaFiles/WorkProduct/1"
            },
            {
              "type": "object",
              "properties": {
                "WID": {
                  "type": "string",
                  "description": "WID"
                }
              }
            }
          ]
        }
      }
    }
  },
  "additionalProperties": false
}

Я пытаюсь создать средство восстановления для схемы такого типа, где $ ref ссылается на другой файл json в другом каталоге. Вот код, который я попытался

import os
import pathlib
import json
from jsonschema import Draft7Validator, FormatChecker, ValidationError, SchemaError, validate, RefResolver, exceptions

BASE_DIR='d:/documents/schemaFiles'
schemaPath='d:/documents/schemaFiles'
json_file='d:/documents/results/OutawsLog.json' #API output

def _validate(schema_search_path, json_data, schema_id):
    """
    load the json file and validate against loaded schema
    """
    try:
        schemastore = {}
        fnames=[]
        for roots, _, files in os.walk(schema_search_path):
            for f in files:
                if f.endswith('.json'):
                    fnames.append(os.path.join(roots, f))

        for fname in fnames:
            with open(fname, "r") as schema_fd:
                schema = json.load(schema_fd)
                if "$id" in schema:
                    print("schema[$id] : ", schema["$id"])
                    schemastore[schema["$id"]] = schema

        test_schema_id='d:/documents/schemaFiles/WLWorkProduct/1'
        schema = schemastore.get(test_schema_id)
        Draft7Validator(schema)
        resolver = RefResolver(BASE_DIR, "file://{0}".format(os.path.join(BASE_DIR, '/WLWorkProduct.json')), schema, schemastore)
        try:
            v=Draft7Validator(schema, resolver=resolver).iter_errors(json_data)
            print("v : ", v)
            for error in v:
                print(error.message)
        except ValidationError as e:
            print(e)
    except Exception as error:
        # handle validation error 
        print(error)
    except SchemaError as error:
        print(error)
        return False


def getData(jsonFile):
    with open(jsonFile) as fr:
        dt=json.loads(fr.read())['results']['results']
        return dt

json_dt=getData(json_file)
for jd in json_dt[:1]:
    print(type(jd))       
    _validate(schemaPath, jd, 1)  

. Это дает мне ключевую ошибку для ссылки на $ ref как

  1. jsonschema.exceptions.RefResolutionError:
  2. KeyError: 'd : / documents / schemaFiles / WorkProduct / 1 '

Мне кажется, что я что-то упускаю при создании рефресливера. Любая помощь будет оценена ..

...