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






Поскольку вы используете файл 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
@Apostolos извините, похоже, я по какой-то причине допустил эту ошибку. Отредактировано, поэтому ответ будет правильным для будущих зрителей. Хотя мой ответ не тот, который действительно отвечает на исходный вопрос.
@ATernative, вопрос был о проверке наличия необходимых полей, а не о том, что какая-то строка может быть проанализирована как JSON.
Если вы не проверили библиотеку схема 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)
'JSONDecodeError' не определен и сам выдает ошибку! Правильное имя — «json.decoder.JSONDecodeError»!