Попытка реализовать jsonschema с помощью просто filepaths - PullRequest
0 голосов
/ 05 июня 2018

Я загрузил json от пользователя и теперь пытаюсь сравнить этот json со схемой, используя валидатор jsonschema.Я получаю сообщение об ошибке: ValidationError: не относится к типу u'object '

Не удалось проверить u'type' в схеме

Это мой код:

from __future__ import unicode_literals

from django.shortcuts import render, redirect


import jsonschema
import json
import os
from django.conf import settings

#File to store all the parsers

def jsonVsSchemaParser(project, file):
    baseProjectURL = 'src\media\json\schema'
    projectSchema = project.lower()+'.schema'
    projectPath = os.path.join(baseProjectURL,projectSchema)
    filePath = os.path.join(settings.BASE_DIR,'src\media\json', file)
    actProjectPath = os.path.join(settings.BASE_DIR,projectPath)
    print filePath, actProjectPath
    schemaResponse = open(actProjectPath)
    schema = json.load(schemaResponse)
    response = open(filePath)
    jsonFile = json.load(response)
    jsonschema.validate(jsonFile, schema)

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

Также я использую Python 2.7 и Django 1.11, еслиэто вообще полезно.

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

РЕДАКТИРОВАТЬ: эта ошибка проверки казалась случайностью.фактическая ошибка проверки, которую я постоянно получаю, это «-1 не имеет типа u'string '».Раздражает то, что так должно быть.Это неправильно, что sessionid не является строкой, но я хочу, чтобы jsonschema обрабатывал ее, но я не хочу, чтобы мои ошибки валидации были приведены в следующем формате: this format.Я хочу собрать все ошибки валидации в массиве, а затем опубликовать их на следующей странице.

Ответы [ 2 ]

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

Я только что положил try-catch вокруг моего метода проверки.Вот как это выглядит:

validationErrors = []

try:
    jsonschema.validate(jsonFile, schema)
except jsonschema.exceptions.ValidationError as error:
    validationErrors.append(error)

РЕДАКТИРОВАТЬ: Это решение работает, только если у вас есть одна ошибка, потому что после вызова ошибки проверки он выходит из метода проверки.Чтобы отобразить каждую ошибку, вам нужно использовать lazy validation .Вот как это выглядит в моем коде, если вам нужен другой пример:

v = jsonschema.Draft4Validator(schema)
for error in v.iter_errors(jsonFile):
    validationErrors.append(error)
0 голосов
/ 05 июня 2018

try-кроме-еще-наконец оператор - отличный способ отловить и обработать исключения (ошибки времени выполнения) в Python.

✓ Так что если вы хотите перехватить и сохранитьИсключения в массиве, тогда отличным решением для вас будет использование оператора try-кроме .Таким образом, вы можете перехватывать и хранить в любой структуре данных, такой как списки и т. Д., И ваша программа при продолжении ее выполнения не прекратит работу.

✓ Ниже приведен модифицированный код, в котором я использовал цикл for, которыйловит ошибку 5 раз и сохраняет в списке.

validationErrors = []

for i in range(5):
    try:
        jsonschema.validate(jsonFile, schema)
    except jsonschema.exceptions.ValidationError as error:
        validationErrors.append(error)

✓ Наконец, вы можете взглянуть на приведенный ниже пример кода, где я сохранил ZeroDivisionError и его связанное строковое сообщение в 2 разныхсписки, повторяя цикл for 5 раз.

2-й список ZeroDivisionErrorMessagesList можно использовать для перехода к шаблону, если вы хотите печатать сообщения на веб-странице (если вы хотите).Вы также можете использовать 1-й.

ZeroDivisionErrorsList = [];
ZeroDivisionErrorMessagesList = list(); # list() is same as [];

for i in range(5):
    try:
        a = 10 / 0; # it will raise exception
        print(a);.  # it will not execute
    except ZeroDivisionError as error:
        ZeroDivisionErrorsList.append(error)
        ZeroDivisionErrorMessagesList.append(str(error))

print(ZeroDivisionErrorsList);
print(); # new line
print(ZeroDivisionErrorMessagesList);

"Выход:

[ZeroDivisionError('division by zero',), 
ZeroDivisionError('division by zero',), 
ZeroDivisionError('division by zero',), 
ZeroDivisionError('division by zero',), 
ZeroDivisionError('division by zero',)]

['division by zero', 'division by zero', 'division by zero', 'division by zero', 'division by zero']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...