После небольшого количества царапин на голове я пришел к следующему шаблону, который решил эту проблему и, кажется, работает надежно, если в коллекции 0, 1 или много элементов.
def node_list(d, k) :
"""
handle a collection node in a json object by returning:
an empty list if there are no child nodes at d[k],
or a list with 1 dictionary entry if there is one child node at d[k]
or a list of dictionaries if there are multiple child nodes at d[k]
"""
if d is None : raise Exception("d is None")
if type(d) is not dict : raise Exception("d is not a dict")
if d.get(k) is None : return []
if type(d.get(k)) is dict : return [d.get(k)]
if type(d.get(k)) is not list : raise Exception("d[k] is not a dict or list")
return d.get(k)
ВызовОбработка коллекции json теперь выглядит следующим образом:
import json
root = json.load(open(file,'r', encoding='utf-8-sig'))
for item in node_list(root,'Item') :
# code to handle each item here
pass
Теперь, если есть 0,1 или много элементов, я получаю соответствующий список с 0, 1 или многими элементами в нем.