如何在python中发送PUT请求之前验证JSON请求主体

时间:2019-10-29 11:32:41

标签: python json request

当我使用JSON请求主体从python向我的API端点发送PUT请求时,我收到空的请求主体,因为有时它包含JSON不支持的特殊字符。

在发送请求之前如何清理JSON?

在发送请求之前,我已经尝试过stringify和解析json!

profile = json.loads(json.dumps(profile))

我的示例无效json是:

{
    "url": "https://www.example.com/edmund-chand/",
    "name": "Edmund Chand",
    "current_location": "FrankfurtAmMainArea,   Germany",
    "education": [],
    "skills": []
}

并且我期望的经过验证的json应该是:

{
    "url": "https://www.example.com/edmund-chand/",
    "name": "Edmund Chand",
    "current_location": "Frankfurt Am Main Area, Germany",
    "education": [],
    "skills": []
}

2 个答案:

答案 0 :(得分:1)

如果您正在寻找快速清理有限字段(即current_location)的json数据的方法,可以尝试以下类似操作:

def sanitize(profile):

    profile['current_location'] = ', '.join([val.strip() for val in profile['current_location'].split(',')])

    return profile

profile = sanitize(profile)

这里的想法是,您将编写代码以清理该函数中的每个位,然后将其发送给您的api或在无效等情况下抛出异常。


要获得更可靠的验证,可以考虑使用jsonschema软件包。更多详细信息here

使用该软件包,您可以更灵活地验证字符串和json模式。

示例摘自包装自述文件:

from jsonschema import validate

# A sample schema, like what we'd get from json.load()
schema = {
     "type" : "object",
     "properties" : {
        "url" : {"type" : "string", "format":"uri"},
        "current_location" : {"type" : "string", "maxLength":25, "pattern": "your_regex_pattern"},
     },
}

# If no exception is raised by validate(), the instance is valid.
validate(instance=profile, schema=schema)

您可以找到关于字符串here的更多信息和可用的验证类型。

答案 1 :(得分:0)

谢谢@Rithin的解决方案,但似乎它与整个JSON的一个字段结合在一起。

我找到了一种解决方案,将其替换为适用于任何字段的以下示例代码:

profile = json.loads(json.dumps(profile).replace("\t", " "))