Чтение строки JSON | TypeError: строковые индексы должны быть целыми числами

Я пытаюсь создать программу, которая будет считываться в строке JSON через GUI, а затем использовать ее для выполнения дополнительных функций, в этом случае разбивая математическое уравнение. На данный момент я получаю сообщение об ошибке:

«TypeError: строковые индексы должны быть целыми»

и я понятия не имею, почему.

JSON, который я пытаюсь прочитать, выглядит следующим образом:

{ "rightArgument":{ "cell":"C18", "value":9.5, "type":"cell" }, "leftArgument":{ "rightArgument":{ "cell":"C3", "value":135, "type":"cell" }, "leftArgument":{ "rightArgument":{ "cell":"C4", "value":125, "type":"cell" }, "leftArgument":{ "cell":"C5", "value":106, "type":"cell" }, "type":"operation", "operator":"*" }, "type":"operation", "operator":"+" }, "type":"operation", "operator":"+" } 
 import json import tkinter from tkinter import * data = "" list = [] def readText(): mtext="" mtext = strJson.get() mlabel2 = Label(myGui,text=mtext).place(x=180,y=200) data = mtext def mhello(): _getCurrentOperator(data) def _getCurrentOperator(data): if data["type"] == "operation": _getCurrentOperator(data["rightArgument"]) _getCurrentOperator(data["leftArgument"]) list.append(data["operator"]) elif data["type"] == "group": _getCurrentOperator(data["argument"]) elif data["type"] == "function": list.append(data["name"]) # TODO do something with arguments for i in range(len(data["arguments"])): _getCurrentOperator(data["arguments"][i]) else: if (data["value"]) == '': list.append(data["cell"]) else: list.append(data["value"]) print(list) myGui = Tk() strJson = StringVar() myGui.title("Simple Gui") myGui.geometry("400x300") label = Label(text = 'Welcome!').place(x=170,y=40) btnStart = Button(myGui,text='Start',command=mhello).place(x=210,y=260) btnRead = Button(myGui,text='Read text',command=readText).place(x=210,y=200) txtEntry = Entry(myGui, textvariable=strJson).place(x=150,y=160) btnOptions = Button(myGui, text = "Options").place(x=150,y=260) myGui.mainloop() 

3 Solutions collect form web for “Чтение строки JSON | TypeError: строковые индексы должны быть целыми числами”

Вы никогда не разбираете строку в словаре (объект json). Измените data = mtext на: data = json.loads(mtext) Вы также должны добавить global data в метод readText

TypeError: string indices must be integers означает попытку доступа к местоположению внутри строки с использованием индекса, который не является целым числом. В этом случае ваш код (строка 18) использует строку "type" в качестве индекса. Поскольку это не целое число, возникает исключение TypeError .

Кажется, что ваш код ожидает, что data станут словарем. Есть (по крайней мере) 3 проблемы:

  1. Вы не декодируете («загружаете») строку JSON. Для этого вы должны использовать json.loads(data) в функции readText() . Это вернет словарь, который ваш код ожидает в другом месте.
  2. data – глобальная переменная со значением, инициализированным пустой строкой ( "" ). Вы не можете изменить глобальную переменную внутри функции без предварительного объявления переменной с использованием ключевого слова global .
  3. Код создает список, добавляя к нему последовательные элементы, однако этот список не используется в другом месте. Он печатается после определения _getCurrentOperator() но это до того, как была выполнена какая-либо обработка, поэтому в этой точке все еще пусто, и отображается [] . Переместите print(list) в mhello() после _getCurrentOperator() . (BTW, используя list как имя переменной, не рекомендуется, поскольку это затеняет встроенный list )

Вы можете пересмотреть readText() так:

 def readText(): global data mtext="" mtext = strJson.get() mlabel2 = Label(myGui,text=mtext).place(x=180,y=200) data = json.loads(mtext) 

иногда вам нужно снова использовать json.loads .. это сработало для меня ..

 jsonn_forSaleSummary_string = json.loads(forSaleSummary) //still string jsonn_forSaleSummary = json.loads(jsonn_forSaleSummary_string) 

в конце концов!! JSON

  • TypeError: неподдерживаемый тип операндов для /: 'str' и 'str'
  • Tensorflow TypeError: аргумент Fetch Нет имеет недопустимый тип <type 'NoneType'>?
  • Flask: TypeError: объект 'int' не может быть выдан
  • Аргумент TypeError: function () после * должен быть последовательностью, а не генератором
  • TypeError: nextDouble (): self arg не может быть принужден к java.util.Random
  • Как преобразовать переменную экземпляра типа, чтобы переменная могла использоваться для аутентификации при выполнении системных вызовов
  • Невозможно получить pygame.Surface.get_at () для правильной работы
  • Проблемы Cython и deepcopy () с ссылочными методами / функциями. Любые альтернативные идеи?
  • Поиск суммы столбца в списке Получение «TypeError: невозможно выполнить сокращение с помощью гибкого типа»
  • ** оператор TypeError
  • 'TypeError: ufunc ...' при использовании + = на массивах numpy
  • Python - лучший язык программирования в мире.