web-dev-qa-db-fra.com

Lecture d'une chaîne JSON | TypeError: les indices de chaîne doivent être des entiers

J'essaie de créer un programme qui lira une chaîne JSON via l'interface graphique, puis l'utiliser pour effectuer des fonctions supplémentaires, dans ce cas, décomposer une équation mathématique. En ce moment, je reçois l'erreur:

"TypeError: les indices de chaîne doivent être des entiers"

et je ne sais pas pourquoi.

Le JSON que j'essaie de lire est le suivant:

{
"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()
13
Billy Dawson

Vous n'analysez jamais la chaîne dans un dictionnaire (objet json). Remplacez data = mtext Par: data = json.loads(mtext) Vous devez également ajouter global data À la méthode readText

18
Vincent Beltman

parfois, vous devez utiliser json.loads à nouveau .. cela a fonctionné pour moi ..

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

enfin!! json

4
Brian Sanchez

TypeError: string indices must be integers Signifie une tentative d'accès à un emplacement dans une chaîne en utilisant un index qui n'est pas un entier. Dans ce cas, votre code (ligne 18) utilise la chaîne "type" Comme index. Comme il ne s'agit pas d'un entier, une exception TypeError est déclenchée.

Il semble que votre code s'attende à ce que data soit un dictionnaire. Il y a (au moins) 3 problèmes:

  1. Vous ne décodez pas ("chargez") la chaîne JSON. Pour cela, vous devez utiliser json.loads(data) dans la fonction readText(). Cela renverra le dictionnaire que votre code attend ailleurs.
  2. data est une variable globale dont la valeur est initialisée sur une chaîne vide (""). Vous ne pouvez pas modifier une variable globale dans une fonction sans d'abord déclarer la variable à l'aide du mot clé global.
  3. Le code construit une liste en y ajoutant des éléments successifs, cependant, cette liste n'est pas utilisée ailleurs. Il est imprimé après la définition de _getCurrentOperator() mais c'est avant tout traitement, il est donc toujours vide à ce stade et [] S'affiche. Déplacez print(list) vers mhello() après_getCurrentOperator(). (BTW utilisant list comme nom de variable n'est pas conseillé car cela masque le list intégré)

Vous pouvez modifier readText() en ceci:

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