【问题标题】:validate JSON file with JSON Template using python使用 python 使用 JSON 模板验证 JSON 文件
【发布时间】:2018-08-18 07:12:04
【问题描述】:

我正在创建一个特定格式的 JSON 文件,因此我想在进一步处理之前验证它是否采用该格式。

模板是这样的

{
  "dev":{
    "username": "",
    "script": "",
    "params": ""
  },
  "qat":{
    "username": "",
    "script": "",
    "params": ""
  },
}

该文件将是填充所有值的位置,对于 usernamescriptparams,对于 devqat

现在我想验证一下,包含数据的文件与模板完全相同。现在,我正在使用以下方法。

接近 将这些文件转换为 dict,然后获取所有密钥。然后比较这些键,如果它们相等,则 JSON 文件按照模板,否则不相等。

这按预期工作,但只是想检查是否有更好更简单的方法

代码:

def test_param_file():
    with open('../utils/param_template.json') as json_data:
        template = json.load(json_data)

    with open('/file.json') as json_data:
        param_file = json.load(json_data)

    assert _get_all_keys(param_file) == _get_all_keys(template)


def _get_all_keys(param):
    global prefix
    global keys
    keys = []

    def func(param):
        for key, value in param.iteritems():
            if type(value) == dict:
                global prefix
                prefix = key
                func(value)

            global keys
            keys.append("%s.%s" % (prefix, key))
    func(param)

    return list(set(keys))

【问题讨论】:

标签: python json python-2.7


【解决方案1】:

由于您正在寻找一种更简单/更好的方法,我建议您查看Marshmallow 以获取此类验证内容。这是一个非常粗略的例子:

from marshmallow import Schema, fields

class EnviornmentSchema(Schema):
    username = fields.Str(required=True)
    scripts = fields.Str(required=True)
    params = fields.Str(required=True)

errors = EnviornmentSchema().validate(file_contents_dict)

基本上,它用 Schema 类替换了您的“模板”系统。您也可以使用nesting,因为您有多个环境字典。当您需要进行更高级的验证时,Marshmallow 变得非常有用。

【讨论】:

    猜你喜欢
    • 2018-02-05
    • 1970-01-01
    • 2018-06-15
    • 2015-07-18
    • 2013-10-23
    • 2020-03-21
    • 1970-01-01
    • 2019-06-26
    • 2019-12-14
    相关资源
    最近更新 更多