简体   繁体   English

在 JSON 中验证多个节点?

[英]Verify multiple nodes in JSON?

Here is my Json data这是我的 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
        }
    ]
}

I need to verify values in MenuItems list.我需要验证MenuItems列表中的值。

eg IsAuthorized value is False for Sub Menu Item3 .例如, Sub Menu Item3 IsAuthorized值为False

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

You can select all SubMenuItems that satisfies: IsAuthorized = True with list comprehension:您可以选择满足列表理解的所有子SubMenuItemsSubMenuItems IsAuthorized = 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}]

If you need to load data from a .json file, you can use the following:如果需要从.json文件加载数据,可以使用以下命令:

import json
from jsoncomment import JsonComment

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

Note: The comma at the end of the list in the .json file is not supported by json.load() .注:在列表末尾的逗号.json文件不被支持json.load() One solution might be to use jsoncomment as suggested in this discussion .一种解决方案可能是使用本讨论中建议的jsoncomment

You can use recursion with a generator:您可以将递归与生成器一起使用:

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))

To find instances when IsAuthorized is False :要在IsAuthorizedFalse时查找实例:

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

Output:输出:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM