当前位置: 首页 > 知识库问答 >
问题:

python解析所有空值的Json

巩衡
2023-03-14

在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的Web应用程序)谢谢

共有1个答案

许茂才
2023-03-14

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

#!/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
 类似资料:
  • 问题内容: 我正在尝试在Go中解析json流。我创建了一个简化的示例: 这会给我 我在sql包中发现了一个可为null的int64 ,但是json似乎无法处理它。 json是否可以处理可为null的int64类型?如果可能的话,我会对将JSON null 转换为-1或MinValue 感到满意。 谢谢您的投入,Fabian 问题答案: 只需使用一个。指针可以为nil,也可以指向具有关联值的int6

  • 为什么下面的代码返回ValueError?

  • 本文向大家介绍解决golang json解析出现值为空的问题,包括了解决golang json解析出现值为空的问题的使用技巧和注意事项,需要的朋友参考一下 我是通过beego框架,将请求过来的json进行解析,并将值保存在结构体中 其中 UpdateCommentRequestData的结构是这样的 common.request的结构是这样的 我使用1中的代码进行解析,发现request.Id的值

  • @可在Service1和service2中注入 tsconfig.json emitDecoratorMetadata设置为true 在NGModule的提供者部分注册了Service1和Service2 如果有关系的话:我正在构建一个Ionic2RC0应用程序。以下是重要的文件: app.module.ts

  • 问题内容: 我有以下要使用Python解析的: 我想找到所有标签,然后提取其中所有实例的值。我正在使用以下代码: 由于命名空间的原因,出现以下错误。 请让我知道如何更改代码以查找所有标签。 问题答案: ElementTree对名称空间不太聪明。你需要给的.find(),findall()和iterfind()方法的明确的命名空间字典。这没有很好的记录: 前缀仅在你传入的参数中查找。这意味着你可以使

  • 我正在尝试使用组件并显示一个对话框。只有当我需要使用时,才会出现此错误。只要不插入就可以创建对话框。 我见过类似这样的问题的其他答案,但我似乎无法将其转化为我的解决方案。需要做些什么才能让它不失败? MessageDialog.component.ts 错误:无法解析MdlDialogReference:(?)的所有参数。在SyntaxError.zoneawareerror(http://loc