簡體   English   中英

使用 python 驗證 JSON 數據

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM