【问题标题】:Reading a json object and removing some values读取一个 json 对象并删除一些值
【发布时间】:2022-12-24 22:46:25
【问题描述】:

我有一个具有以下结构的 JSON 对象:

{
    "org_name": "1",
    "available": True,
    "orgs": [
        {
            "org_name": "2",
            "available": False,
            "orgs": []
        },
        {
            "org_name": "3",
            "available": False,
            "orgs": []
        },
        {
            "org_name": "4",
            "available": True,
            "orgs": []
        },
        {
            "org_name": "5",
            "available": False,
            "orgs": [
                {
                    "org_name": "6",
                    "available": False,
                    "orgs": []
                },
                {
                    "org_name": "7",
                    "available": False,
                    "orgs": []
                },
                {
                    "org_name": "8",
                    "available": False,
                    "orgs": [
                        {
                            "org_name": "9",
                            "available": False,
                            "orgs": []
                        },
                        {
                            "org_name": "10",
                            "available": True,
                            "orgs": []
                        }
                    ]
                }
            ]
        }
    ]
}

我想解析这个 JSON 数据并得到类似于这样的输出:

{
  "org_name": "1",
  "orgs": [
    {
      "org_name": "4",
      "orgs": []
    },
    {
      "org_name": "5",
      "orgs": [
        {
          "org_name":"8",
           "orgs":[
           {
           "org_name":"10"
           }
         ]
        }
      ]
    }
}

条件是:

  • 如果availableTrue,输出应该包含它的org_nameorgs
  • 如果availableFalse那么它应该被删除;
  • 如果孩子org有它的availableTrue,那么完整的父组织应该存在。

我很难找到获得输出的逻辑。

任何帮助表示赞赏

【问题讨论】:

  • 你能包括你到目前为止尝试过的代码吗?
  • 您需要编写递归函数来解析/遍历非空orgs
  • 为什么"org_name":"4" 是输出中"org_name":"5" 的父级JSON而在输入中他们是兄弟姐妹?
  • @NimaAfshar 对不起,一个错误..我已经改正了

标签: python json


【解决方案1】:

您需要编写简单的递归函数来检查您的 JSON 对象是否可用或它的任何子节点是否可用:

def filter_orgs(source):
    orgs = [org for o in source["orgs"] if (org := filter_orgs(o))]
    if orgs or source["available"]:
        return {
            "org_name": source["org_name"], 
            "orgs": orgs
        }

用法:

source = {
    "org_name": "1",
    "available": True,
    "orgs": [
        {
            "org_name": "2",
            "available": False,
            "orgs": []
        },
        {
            "org_name": "3",
            "available": False,
            "orgs": []
        },
        {
            "org_name": "4",
            "available": True,
            "orgs": []
        },
        {
            "org_name": "5",
            "available": False,
            "orgs": [
                {
                    "org_name": "6",
                    "available": False,
                    "orgs": []
                },
                {
                    "org_name": "7",
                    "available": False,
                    "orgs": []
                },
                {
                    "org_name": "8",
                    "available": False,
                    "orgs": [
                        {
                            "org_name": "9",
                            "available": False,
                            "orgs": []
                        },
                        {
                            "org_name": "10",
                            "available": True,
                            "orgs": []
                        }
                    ]
                }
            ]
        }
    ]
}

filtered_source = filter_orgs(source)

输出:

{
    "org_name": "1",
    "orgs": [
        {
            "org_name": "4",
            "orgs": []
        },
        {
            "org_name": "5",
            "orgs": [
                {
                    "org_name": "8",
                    "orgs": [
                        {
                            "org_name": "10",
                            "orgs": []
                        }
                    ]
                }
            ]
        }
    ]
}

更新。您还可以实现字典的就地修改:

def filter_orgs_inplace(source):
    available = source.pop("available")
    for i in range(len(orgs := source["orgs"]) - 1, -1, -1):
        if not filter_orgs_inplace(orgs[i]):
            del orgs[i]
        else:
            available = True
    if not available:
        source.clear()
    return available

用法:

source = {
    "org_name": "1",
    "available": True,
    "orgs": [
        {
            "org_name": "2",
            "available": False,
            "orgs": []
        },
        {
            "org_name": "3",
            "available": False,
            "orgs": []
        },
        {
            "org_name": "4",
            "available": True,
            "orgs": []
        },
        {
            "org_name": "5",
            "available": False,
            "orgs": [
                {
                    "org_name": "6",
                    "available": False,
                    "orgs": []
                },
                {
                    "org_name": "7",
                    "available": False,
                    "orgs": []
                },
                {
                    "org_name": "8",
                    "available": False,
                    "orgs": [
                        {
                            "org_name": "9",
                            "available": False,
                            "orgs": []
                        },
                        {
                            "org_name": "10",
                            "available": True,
                            "orgs": []
                        }
                    ]
                }
            ]
        }
    ]
}

filter_orgs_inplace(source)  # modifies source

输出:

{
    "org_name": "1",
    "orgs": [
        {
            "org_name": "4",
            "orgs": []
        },
        {
            "org_name": "5",
            "orgs": [
                {
                    "org_name": "8",
                    "orgs": [
                        {
                            "org_name": "10",
                            "orgs": []
                        }
                    ]
                }
            ]
        }
    ]
}

【讨论】:

    猜你喜欢
    • 2017-12-13
    • 2017-09-05
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多