2015-01-08 31 views
13

मैं एक प्रोग्राम बनाने की कोशिश कर रहा हूं जो जीयूआई के माध्यम से एक JSON स्ट्रिंग में पढ़ेगा और फिर अतिरिक्त कार्यों को करने के लिए इसका उपयोग करेगा, इस मामले में गणितीय समीकरण को तोड़ना होगा। फिलहाल मुझे त्रुटि मिल रही है:एक JSON स्ट्रिंग पढ़ना | TypeError: स्ट्रिंग इंडेक्स पूर्णांक होना चाहिए

"TypeError: string indices must be integers"

और मुझे नहीं पता कि क्यों।

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() 
+0

क्या आप पूरे स्टैकट्रैक दे सकते हैं? –

+0

हाय, उत्तर के लिए धन्यवाद :) प्रोग्राम चलाने के दौरान, कॉल स्टैक विंडो खाली बनी हुई है –

उत्तर

16

तुम कभी एक शब्दकोश (json वस्तु) को स्ट्रिंग को पार्स कर रहे हैं। करने के लिए data = mtext बदलें: data = json.loads(mtext) तुम भी readText विधि

+0

@ राविंग का मतलब है कि आप मिहेलो में सही हैं? कारण _getCurrentOperator पहले ही पैरामीटर द्वारा इसे प्राप्त करता है। –

+0

ठीक टीवाई संपादित करेगा। मैं हमेशा ओओपी का उपयोग कर रहा हूं इसलिए मैं वैश्विक से परिचित नहीं हूं। –

+0

उत्तर के लिए धन्यवाद! इन परिवर्तनों को करने के बाद भी मुझे एक ही त्रुटि का सामना करना पड़ रहा है –

4

TypeError: string indices must be integers को global data जोड़ना चाहिए एक सूचकांक कि एक पूर्णांक नहीं है का उपयोग कर एक स्ट्रिंग के भीतर एक स्थान एक्सेस करने के प्रयास का मतलब है। इस मामले में आपका कोड (लाइन 18) एक सूचकांक के रूप में स्ट्रिंग "type" का उपयोग कर रहा है। चूंकि यह एक पूर्णांक नहीं है, TypeError अपवाद उठाया गया है।

ऐसा लगता है कि आपका कोड data एक शब्दकोश होने की उम्मीद है। वहां (कम से कम) 3 समस्याएं हैं:

  1. आप जेएसओएन स्ट्रिंग को डीकोडिंग ("लोडिंग") नहीं कर रहे हैं। इसके लिए आपको readText() फ़ंक्शन में json.loads(data) का उपयोग करना चाहिए। यह उस शब्दकोश को वापस कर देगा जो आपका कोड कहीं और अपेक्षा करता है।
  2. data एक वैश्विक चर है जो एक खाली स्ट्रिंग ("") से शुरू होने वाला मान है। आप global कीवर्ड का उपयोग करके चर को घोषित किए बिना किसी फ़ंक्शन के भीतर एक वैश्विक चर को संशोधित नहीं कर सकते हैं।
  3. कोड लगातार वस्तुओं को जोड़कर एक सूची बनाता है, हालांकि, उस सूची का उपयोग कहीं और नहीं किया जाता है। यह _getCurrentOperator() की परिभाषा के बाद मुद्रित है लेकिन यह किसी भी प्रसंस्करण के पहले किया गया है, इसलिए यह अभी भी उस बिंदु पर खाली है और [] प्रदर्शित होता है। _getCurrentOperator() के बाद print(list)mhello() पर जाएं।

(के रूप में इस छाया builtin list BTW list का उपयोग कर के रूप में एक चर नाम की सलाह नहीं दी जाती है) आप इस के लिए readText() को संशोधित कर सकते हैं:

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

"ऐसा लगता है कि आपका कोड डेटा को एक शब्दकोश होने की उम्मीद कर रहा है।" +1 – Robin

3

कभी कभी तुम json.loads फिर से उपयोग करने की आवश्यकता .. यह मेरे लिए काम किया ..

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

आखिरकार !! जेसन

संबंधित मुद्दे