📜  Python-Json 3 : python中验证是否为有效JSON数据

📅  最后修改于: 2020-08-27 00:46:32             🧑  作者: Mango

在上一章节中,主要学习了Json数据的序列化。

在本章节中,我们将学习如何使用Python验证JSON数据。在多种情况下,我们需要不同类型的JSON验证。主要分两种;

  • 验证字符串是否有效JSON:我们可以在解析字符串之前检查字符串是否有效JSON。例如,如果您正在使用任何API,则返回无效的JSON或任何其他数据该怎么办?在这里,我们将按照标准约定格式验证JSON 。
  • 通过检查JSON中是否存在所有必需的字段来验证传入的JSON数据,以及验证那些字段的数据类型

检查字符串是否为有效JSON

当我们从任何API收到JSON响应时,必须在使用该数据执行任何操作之前对其进行验证。有多种方法可以按照标准约定格式验证JSON。

1. 使用load和loads方法

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方法。在第一个JSON数据中,我们添加了一个额外的逗号以使其无效,因为此json.loads方法生成了valueError。
  • 在第二个调用中,我们传递了一个有效的JSON文档,并且该json.loads方法成功解析了该数据。

注意:使用json.load()方法代替json.loads()可以文件中解析和验证JSON

2. 使用json.tool 工具和命令行验证

Python提供json.tool了用于从命令行验证JSON对象模块。当我们向客户端发送JSON响应或将JSON数据写入文件时,我们需要确保将经过验证的数据写入文件中

2.1 验证字符串Json

echo {"id": 1 "name": "Jessa Duggar"} | python -m json.tool

输出为:Expecting ',' delimiter: line 1 column 10 (char 9)

2.2 验证Json 文件

本地的Json文件如下:

# python -m json.tool fileName(json文件所在的路径)

输出结果未为:Expecting property name enclosed in double quotes: line 4 column 3 (char 44)

输出显示在第4行存在错误。

通过字段和字段的类型验证JSON

有时我们需要的不仅仅是标准的JSON验证。我们也可以通过检查JSON文件或响应中存在的所有必要字段来验证传入的JSON数据,以及如何验证这些字段的数据类型。

这种情况包括以下内容:

  • 我们需要JSON文件中存在的必要字段
  • 我们需要以所需类型提交的JSON数据。例如,我们希望所有数字字段都采用Number格式,而不是像这样的string格式编码字Marks: "75", 因此我们可以直接使用它,而不必每次都检查和转换它。

我们需要使用该jsonschema库。该库对于验证JSON数据很有用。该库使用该格式基于给定的架构进行验证。

使用jsonschema,我们可以创建一个自己选择的模式,因此每次我们可以针对该模式验证JSON文档时,如果通过了,我们就可以说JSON文档是有效的。

请按照以下步骤操作:

  • 首先,使用pip命令安装jsonschema,pip install jsonschema
  • 定义架构:描述您期望使用哪种JSON
  • 使用json.loadjson.loads方法将JSON转换为Python对象。
  • 将结果JSON传递到的validate()方法jsonschema。如果给定的json不是架构中描述的内容,则此方法将引发异常。

让我们来看一个例子。在此示例中,我正在验证学生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'

 

 

———–>>>>>>本结内容到此结束,感谢阅读