Проверить данные JSON с помощью python

Мне нужно создать функцию, которая проверяет входящие данные json и возвращает python dict. Он должен проверить наличие всех необходимых полей в файле json, а также проверить типы данных этих полей. Мне нужно использовать try-catch. Не могли бы вы предоставить какие-то фрагменты или примеры, которые дадут мне ответы?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
10
0
41 653
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Поскольку вы используете файл JSON, вы можете использовать этот пример:

import json
def validate(filename):
    with open(filename) as file:
        try:
            return json.load(file) # put JSON-data to a variable
        except json.decoder.JSONDecodeError:
            print("Invalid JSON") # in case json is invalid
        else:
            print("Valid JSON") # in case json is valid

'JSONDecodeError' не определен и сам выдает ошибку! Правильное имя — «json.decoder.JSONDecodeError»!

Apostolos 30.06.2020 11:49

@Apostolos извините, похоже, я по какой-то причине допустил эту ошибку. Отредактировано, поэтому ответ будет правильным для будущих зрителей. Хотя мой ответ не тот, который действительно отвечает на исходный вопрос.

ATernative 01.07.2020 22:03

@ATernative, вопрос был о проверке наличия необходимых полей, а не о том, что какая-то строка может быть проанализирована как JSON.

skoriy 24.03.2021 22:25
Ответ принят как подходящий

Если вы не проверили библиотеку схема json, может быть полезно проверить данные. JSON-схема — это способ описания содержимого JSON. Библиотека просто использует формат для проверки на основе заданной схемы.

Я сделал простой пример из базового использования.

import json
from jsonschema import validate

# Describe what kind of json you expect.
schema = {
    "type" : "object",
    "properties" : {
        "description" : {"type" : "string"},
        "status" : {"type" : "boolean"},
        "value_a" : {"type" : "number"},
        "value_b" : {"type" : "number"},
    },
}

# Convert json to python object.
my_json = json.loads('{"description": "Hello world!", "status": true, "value_a": 1, "value_b": 3.14}')

# Validate will raise exception if given json is not
# what is described in schema.
validate(instance=my_json, schema=schema)

# print for debug
print(my_json)

У меня была та же проблема, и я был недоволен существующим решением с использованием jsonschema. Он выдает ужасные сообщения об ошибках, которые совсем не удобны для пользователя.

Я написал свою собственную библиотеку для определения схем, которая имеет много дополнительных функций по сравнению с jsonschema:

https://github.com/FlorianDietz/syntaxTrees

Он выдает очень точные сообщения об ошибках, позволяет писать код для настройки процесса проверки, позволяет определять функции, работающие с проверенным JSON, и даже создает HTML-документацию для определяемых вами схем.

Схемы определяются как классы, подобно тому, как Django определяет модели:

class MyExampleNode(syntaxTreesBasics.Node):
    field_1 = fields.Float(default=0)
    field_2 = fields.String()
    field_3 = fields.Value('my_example_node', null=True, default=None)
    class Meta:
        name = 'my_example_node'

Jsonschema и синтаксические деревья являются излишними только для поиска основных синтаксических ошибок, а решение try/except не дает подсказок относительно того, где именно. Это незначительное улучшение предоставляет сообщение об ошибке, необходимое для поиска проблемы:

import json
def validate(filename):
    with open(filename) as file:
        try:
            return json.load(file) # put JSON-data to a variable
        except json.decoder.JSONDecodeError as err:
            print(f"Invalid JSON: {err}") # in case json is invalid
        else:
            print("Valid JSON") # in case json is valid

Например, с этим в файле:

{"a": 123, 'b': 456}

это обеспечит:

invalid JSON: Expecting property name enclosed in double quotes: line 1 column 12 (char 11)

Это своего рода подсказка, которая понадобится пользователю, чтобы найти проблему без накладных расходов на создание полной схемы.

Хотя модуль Jsonschema хорош, но в документации отсутствуют сложные примеры. И библиотека не сообщает об ошибках из-за недопустимой схемы, просто игнорируя!

Это пример:

from jsonschema import validate

set_tl_schema = {
    "type" : "object",
    "properties" :  {

    "level": {
      "value": {"type" : "number"},
      "updatedAt": {"type" : "number"}
    }
}
}

x = {'level': {'updatedAt': '1970-01-01T00:00:00.000Z', 'value': 1}, }

try:
    validate(instance=x, schema=set_tl_schema)
except jsonschema.exceptions.ValidationError as ex:
    print(ex)

Ошибка заключалась в том, что уровень также нуждался в поле свойств. Но валидатор никогда не сообщит вам об этом.

Я нашел очень эффективный и простой в использовании модуль:

https://pypi.org/project/json-checker/

>>> from json_checker import Checker

>>> current_data = {'first_key': 1, 'second_key': '2'}
>>> expected_schema = {'first_key': int, 'second_key': str}


>>> checker = Checker(expected_schema)
>>> result = checker.validate(current_data)

Другие вопросы по теме