2

Here is my Json data

{
    "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.

e.g. IsAuthorized value is False for Sub Menu Item3.

"Title": "Sub Menu Item3" , "IsAuthorized":false
martineau
  • 119,623
  • 25
  • 170
  • 301
Devang
  • 365
  • 2
  • 6
  • 26

2 Answers2

2

You can select all SubMenuItems that satisfies: IsAuthorized = True with list comprehension:

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:

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(). One solution might be to use jsoncomment as suggested in this discussion.

Alexandre B.
  • 5,387
  • 2
  • 17
  • 40
0

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:

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

Output:

[{'Title': 'Sub Menu Item3', 'IsAuthorized': False}]
Ajax1234
  • 69,937
  • 8
  • 61
  • 102