【问题标题】:Verify multiple nodes in JSON?验证 JSON 中的多个节点?
【发布时间】:2019-12-04 20:09:06
【问题描述】:

这是我的 Json 数据

{
    "DateCreated": "2019-07-26T10:25:27.1326123Z",
    "CachedEntity": false,
    "ToolsTitle": null,
    "Profile": false,
    "MenuItems": [{
            "SubMenuItems": [{
                    "SubMenuItems": [],
                    "Title": "Sub Menu Item1",
                    "IsAuthorized": true,
                }, {
                    "SubMenuItems": [],
                    "Title": "Sub Menu Item2",
                    "IsAuthorized": true,
                }
            ],
            "Title": "Menu Item1",
            "IsAuthorized": true
        }, {
            "SubMenuItems": [{
                    "SubMenuItems": [],
                    "Title": "Sub Menu Item3",
                    "IsAuthorized": false,
                }, {
                    "SubMenuItems": [],
                    "Title": "Sub Menu Item4",
                    "IsAuthorized": true,
                }
            ],
            "Title": "Menu Item2",
            "IsAuthorized": true
        }
    ]
}

我需要验证MenuItems 列表中的值。

例如 IsAuthorized 的值是 False 对应于 Sub Menu Item3

"Title": "Sub Menu Item3" , "IsAuthorized":false

【问题讨论】:

  • 你有什么问题?
  • 它甚至不是有效的 json?
  • @brentertainer 使用 Python 脚本我想验证上面的 Json。当“Title”值为“Sub Menu Item3”时,我需要验证节点“IsAuthorised”值为“False”
  • @NemoMeMeliorEst 为什么?怎么了?
  • @NemoMeMeliorEst 它是 100% 有效的 JSON。它只是不是一个有效的python dict,这两件事是不同的。

标签: python json python-3.x


【解决方案1】:

您可以将递归与生成器一起使用:

data = {'DateCreated': '2019-07-26T10:25:27.1326123Z', 'CachedEntity': False, 'ToolsTitle': None, 'Profile': False, 'MenuItems': [{'SubMenuItems': [{'SubMenuItems': [], 'Title': 'Sub Menu Item1', 'IsAuthorized': True}, {'SubMenuItems': [], 'Title': 'Sub Menu Item2', 'IsAuthorized': True}], 'Title': 'Menu Item1', 'IsAuthorized': True}, {'SubMenuItems': [{'SubMenuItems': [], 'Title': 'Sub Menu Item3', 'IsAuthorized': False}, {'SubMenuItems': [], 'Title': 'Sub Menu Item4', 'IsAuthorized': True}], 'Title': 'Menu Item2', 'IsAuthorized': True}]}
def results(d):
   if "IsAuthorized" in d:
      yield {i:d.get(i) for i in ['Title', 'IsAuthorized']}
   for a, b in d.items():
      if isinstance(b, dict):
         yield from results(b)
      elif isinstance(b, list):
         for i in b:
            yield from results(i)

result = list(results(data))

查找IsAuthorizedFalse 的实例:

final_results = [i for i in result if not i['IsAuthorized']]

输出:

[{'Title': 'Sub Menu Item3', 'IsAuthorized': False}]

【讨论】:

    【解决方案2】:

    您可以选择所有满足SubMenuItemsIsAuthorized = True 列表理解:

    out = [sub_menu_Items for sub in data["MenuItems"]
           for sub_menu_Items in sub["SubMenuItems"] if not sub_menu_Items["IsAuthorized"]]
    
    print(out)
    # [{'SubMenuItems': [], 'Title': 'Sub Menu Item3', 'IsAuthorized': False}]
    
    # To match the expected output:
    out = [{k: full_dict[k] for k in ('Title', 'IsAuthorized')} for full_dict in out]
    print(out)
    # [{'Title': 'Sub Menu Item3', 'IsAuthorized': False}]
    

    如果您需要从.json 文件加载数据,您可以使用以下内容:

    import json
    from jsoncomment import JsonComment
    
    with open("filename.json", "r") as f:
        parser = JsonComment(json)
        data = parser.load(f)
    

    注意:json.load() 不支持.json 文件中列表末尾的逗号。一种解决方案可能是按照discussion 中的建议使用jsoncomment

    【讨论】:

    • 出于好奇,JsonComment 有什么用?你就不能data = json.load(f)吗?
    • .json 文件中列表末尾的逗号使用json.load 会引发错误。我从这个discussion
    • 明白了。很好的答案。
    猜你喜欢
    • 2019-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 2021-12-27
    • 2023-03-21
    • 1970-01-01
    相关资源
    最近更新 更多