Попытка реализовать json-схему с помощью только путей к файлам

Talha Ahmed спросил: 12 мая 2018 в 05:15 в: python

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

Ошибка проверки u'type' в схеме

Это мой код:

from __future__ import unicode_literalsfrom django.shortcuts import render, redirectimport jsonschema
import json
import os
from django.conf import settings#File to store all the parsersdef 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, так как я использовал ее и в командной строке.

EDIT: эта ошибка проверки показалась случайной. фактическая ошибка проверки, которую я постоянно получаю, это "-1 не относится к типу u'string". Досадно, что это должно быть так. Неправильно, что sessionid не является строкой, но я хочу, чтобы это обрабатывалось jsonschema, но я не хочу, чтобы мои ошибки проверки были указаны в этом формате: . То, что я хочу сделать, - собрать все ошибки проверки в массиве, а затем отправить его пользователю на следующей странице.

2 ответа

Есть решение
Talha Ahmed ответил: 12 мая 2018 в 10:23

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

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

EDIT: это решение работает только в том случае, если у вас есть одна ошибка, потому что после того, как выдается ошибка проверки, она выходит из метода проверки. Чтобы представить каждую ошибку, вам нужно использовать ленивую проверку. Вот как он выглядит в моем коде, если вам нужен другой пример:

v = jsonschema.Draft4Validator(schema)
for error in v.iter_errors(jsonFile):
    validationErrors.append(error)
hygull ответил: 12 мая 2018 в 02:44

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

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

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

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

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

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

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']
Talha Ahmed ответил: 12 мая 2018 в 09:53
Таким образом, на самом деле проблема с этим методом. Он работает только один раз. Я думаю, нам нужно использовать какой-то цикл, чтобы он мог поймать каждую ошибку проверки.
hygull ответил: 12 мая 2018 в 02:47
@Talha, вы можете использовать простой цикл for и поместить в него свой код. Он не сломается, если ваш код внутри блока except не вызывает никаких Исключение. Я добавил пример в свой ответ. Вы можете взглянуть на это. Пожалуйста, дайте мне знать, если у вас все еще есть проблемы.