[英]Validate JSON data using python
我需要創建一個 function 來驗證傳入的 json 數據並返回 python 字典。 它應該檢查 json 文件中是否存在所有必需的字段,並驗證這些字段的數據類型。 我需要使用 try-catch。你能提供一些能給我答案的片段或例子嗎?
如果您還沒有檢查jsonschema庫,它可以用於驗證數據。 JSON Schema是一種描述 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)
當您使用 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
我遇到了同樣的問題,對使用 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)
這是用戶在沒有創建完整模式的開銷的情況下定位問題所需的提示。
從json
模塊開始。 它可以將json字符串加載到python字典中,自動將字符串,整數/浮點數和布爾值轉換為其等效的python類型。 例如:
>>> import json
>>> my_json_string = '{"description": "Hello world!", "status": true, "value_a": 1, "value_b": 3.14}'
>>> data = json.loads(my_json_string)
print(data)
{'description': 'Hello world!', 'status': True, 'value_a': 1, 'value_b': 3.14}
除此之外,如果您需要驗證特定的數據類型或值,則需要檢查dict。 您可以使用isinstance
檢查類型,例如, isinstance(data['value_a'], int)
與整數類型匹配時將返回True
。
我在這里看不到任何需要使用try / catch的地方,這樣做是有意地使用它來編寫代碼以“強制”使用-例如,如果結果不是您期望的那樣,則使用斷言引發異常。 不過,這聽起來不算是一種好習慣,因此,如果您可以提供有關您要實現的目標的更多詳細信息,我會留給您。
雖然 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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.