【问题标题】:python parse Json for all null valuespython解析所有空值的Json
【发布时间】:2014-12-18 08:43:05
【问题描述】:

在 web2py 服务器上使用 python 我有以下问题。 如何循环通过 json 查找所有具有空值(或空字符串)的键并收集这些键以报告缺少的内容:

这是我的 json 示例。

 {
"version" : 1,
"general" : {
    "scriptFrom" : "",
    "scriptTo" : "1.1.2014",
    "scriptComment" : "dada"
},
"nbworkersDays" : [{
        "days" : ["1", "2"],
        "data" : [{
                "nbWorkersFrom" : 2,
                "nbWorkersTo" : null,
                "timeFrom" : "12:00",
                "timeTo" : ""
            }
        ,{
            "nbWorkersFrom" : 2,
            "nbWorkersTo" : 7,
            "timeFrom" : "9:00",
            "timeTo" : "14:00"
        }
    ]
    }
]}

我想检索一个包含所有键的列表,如果嵌套比第一级。第二级。 missingData= [scriptFrom, nbworkersDays.nbWorkersTo, nbworkersDays.timeTo]

有关如何解决此问题或如何收集所有错误以报告给客户的任何建议 (我有一个使用 web2py 的网络应用程序) 谢谢

【问题讨论】:

    标签: python json error-handling web2py


    【解决方案1】:

    您可以使用递归函数来迭代复杂对象的值,同时记住您所在的路径(以报告回来):

    #!/usr/bin/env python
    
    # used to parse the json text
    import json
    with open('json.txt', 'r') as f:
        d = json.load(f)
    # define list of what your consider as "missing"
    missings = [None, ""]
    
    # recursive function to collect missing paths and alter the aggregator list
    # make sure to add cases if needed
    def aggregate_missing_paths(aggregator, path, item):
        if isinstance(item, list):
            # check all list items
            map(lambda x: aggregate_missing_paths(aggregator, path, x), item)
        if isinstance(item, dict):
            # check all dict items
            map(lambda kv: aggregate_missing_paths(aggregator, path + '.' + kv[0], kv[1]), item.iteritems())
        if item in missings:
            # alter list to cotain path to missing
            aggregator.append(path)
    
    aggregator = []
    aggregate_missing_paths(aggregator, 'root', d)
    print aggregator
    

    编辑:

    我使用递归生成器添加了一个没有聚合器的版本:

    #!/usr/bin/env python
    
    import json
    with open('json.txt', 'r') as f:
        d = json.load(f)
    missings = [None, ""]
    def generate_missing_paths(path, item):
        if isinstance(item, list):
            for v in item:
                for current_path in generate_missing_paths(path, v):
                    yield current_path
        if isinstance(item, dict):
            for k, v in item.iteritems():
                for current_path in generate_missing_paths(path + '.' + k, v):
                    yield current_path
        if item in missings:
            yield path
    
    for path in generate_missing_paths('root', d):
        print path
    

    【讨论】:

    • 您的第二个版本有问题,我不是产量专家,但我认为它在这里引起了问题,因为它保留了旧的字符串模式并向其中添加了新结果,这是一个你的第二个版本输出的例子:root.nbworkersDays.data.nbWorkersToroot.nbworkersDays.data.nbWorkersTo.timeToroot.nbworkersDays.data.nbWorkersTo.timeTo.general.scriptFrom第一个版本输出正确的结果:[u'root.nbworkersDays.data.nbWorkersTo', u'root.nbworkersDays.data.timeTo', u'root.general.scriptFrom']我无法解决问题,你能在这里给我提示吗?
    • @Oscar- 感谢您的关注。这是变量名的简单混合。我使用path(来自函数的参数)作为循环变量,它反复改变它。我现在改为local_path,它应该可以工作了。
    猜你喜欢
    • 1970-01-01
    • 2019-02-13
    • 1970-01-01
    • 1970-01-01
    • 2020-08-19
    • 1970-01-01
    • 2012-06-15
    • 1970-01-01
    • 2013-05-05
    相关资源
    最近更新 更多