TypeError: строковые индексы должны быть целыми числами и другими с коллекциями JSON - PullRequest
0 голосов
/ 06 апреля 2019

Загружая коллекции json в Python, я обнаружил ряд проблем, которые могут возникнуть, когда в коллекции может быть 0, 1 или более элементов, и python переключается между не найденным объектом, объектом словаря и списком словарей.Оглядываясь вокруг, я увидел код, пытающийся справиться с этим различными способами, но на самом деле не нашел общего решения, которое, как я полагаю, должно быть довольно распространенной проблемой, когда существует переменное количество элементов.

Существующий совет, по-видимому, закончился обработкой объекта if ... elif ... else объекта json, но это действительно грязно, когда вы обрабатываете объект, потому что вы заканчиваете кодом для обработки объекта в нескольких ветвях кода..

1 Ответ

0 голосов
/ 06 апреля 2019

После небольшого количества царапин на голове я пришел к следующему шаблону, который решил эту проблему и, кажется, работает надежно, если в коллекции 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 или многими элементами в нем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...