📅  最后修改于: 2020-08-27 00:46:32             🧑  作者: Mango
在上一章节中,主要学习了Json数据的序列化。
在本章节中,我们将学习如何使用Python验证JSON数据。在多种情况下,我们需要不同类型的JSON验证。主要分两种;
当我们从任何API收到JSON响应时,必须在使用该数据执行任何操作之前对其进行验证。有多种方法可以按照标准约定格式验证JSON。
https://www.imangodoc.com/4444.html
众所周知,json模块提供了两种使用Python解析JSON数据的方法。
json.loads()
:从String解析JSON。json.load()
从文件解析JSON。如果您传递的字符串或数据不能被解码为JSON,则这两种方法都将引发ValueError。当我们收到JSON响应时,可以将其传递给json.loads()
方法以按照标准约定对其进行验证。
import json
def validateJSON(jsonData):
try:
json.loads(jsonData)
except ValueError as err:
return False
return True
InvalidJsonData = """{"name": "jane doe", "salary": 9000, "email": "jane.doe@pynative.com",}"""
isValid = validateJSON(InvalidJsonData)
print("Given JSON string is Valid", isValid)
validJsonData = """{"name": "jane doe", "salary": 9000, "email": "jane.doe@pynative.com"}"""
isValid = validateJSON(validJsonData)
print("Given JSON string is Valid", isValid)
json.loads
方法生成了valueError。json.loads
方法成功解析了该数据。注意:使用json.load()
方法代替json.loads()
可以从文件中解析和验证JSON。
Python提供json.tool
了用于从命令行验证JSON对象的 模块。当我们向客户端发送JSON响应或将JSON数据写入文件时,我们需要确保将经过验证的数据写入文件中
echo {"id": 1 "name": "Jessa Duggar"} | python -m json.tool
Expecting ',' delimiter: line 1 column 10 (char 9)
本地的Json文件如下:
# python -m json.tool fileName(json文件所在的路径)
输出结果未为:Expecting property name enclosed in double quotes: line 4 column 3 (char 44)
输出显示在第4行存在错误。
有时我们需要的不仅仅是标准的JSON验证。我们也可以通过检查JSON文件或响应中存在的所有必要字段来验证传入的JSON数据,以及如何验证这些字段的数据类型。
这种情况包括以下内容:
Marks: "75"
, 因此我们可以直接使用它,而不必每次都检查和转换它。我们需要使用该jsonschema
库。该库对于验证JSON数据很有用。该库使用该格式基于给定的架构进行验证。
使用jsonschema
,我们可以创建一个自己选择的模式,因此每次我们可以针对该模式验证JSON文档时,如果通过了,我们就可以说JSON文档是有效的。
请按照以下步骤操作:
pip install jsonschema
json.load
或json.loads
方法将JSON转换为Python对象。validate()
方法jsonschema
。如果给定的json不是架构中描述的内容,则此方法将引发异常。让我们来看一个例子。在此示例中,我正在验证学生JSON。必须满足以下条件才能将其称为有效JSON
import json
import jsonschema
from jsonschema import validate
# Describe what kind of json you expect.
studentSchema = {
"type": "object",
"properties": {
"name": {"type": "string"},
"rollnumber": {"type": "number"},
"marks": {"type": "number"},
},
}
def validateJson(jsonData):
try:
validate(instance=jsonData, schema=studentSchema)
except jsonschema.exceptions.ValidationError as err:
return False
return True
# Convert json to python object.
jsonData = json.loads('{"name": "jane doe", "rollnumber": "25", "marks": 72}')
# validate it
isValid = validateJson(jsonData)
if isValid:
print(jsonData)
print("Given JSON data is Valid")
else:
print(jsonData)
print("Given JSON data is InValid")
# Convert json to python object.
jsonData = json.loads('{"name": "jane doe", "rollnumber": 25, "marks": 72}')
# validate it
isValid = validateJson(jsonData)
if isValid:
print(jsonData)
print("Given JSON data is Valid")
else:
print(jsonData)
print("Given JSON data is InValid")
输出:
{'name': 'jane doe', 'rollnumber': '25', 'marks': 72}
Given JSON data is InValid
{'name': 'jane doe', 'rollnumber': 25, 'marks': 72}
Given JSON data is Valid
注意:validate()
如果给定的JSON不是架构中描述的内容,则该方法将引发异常。
第一个JSON数据包含字符串格式的滚动编号值,而不是数字,因此当我们调用validate()方法时,它返回False。如果打印异常,它将显示如下。
Failed validating 'type' in schema['properties']['rollnumber']: {'type': 'number'}
On instance['rollnumber']: '25'
———–>>>>>>本结内容到此结束,感谢阅读