2010-04-27 7 views
1

JSON 가져 오기/파싱으로 작성된 jython의 dicts와 작업하고 있습니다. 내가 좋아하는 뭔가를 할 때"str 인덱스는 정수 여야합니다"는 의미는 무엇입니까?

TypeError: str indices must be integers 

이 발생합니다 : 나는 다음과 같은 메시지가 표시 특정 섹션으로 작업

{'foo': {'bar':'baz'} } 
이 무슨 뜻 무엇

, 그리고 : jsondata 모습

if jsondata['foo']['bar'].lower() == 'baz': 
    ... 

어떻게 수정해야합니까?

+2

>>> jsondata = {'a': '', 'b': {'z': True} } >>> for key in jsondata: ... if type(jsondata[key]) is dict and 'z' in jsondata[key].keys() and jsondata[key]['z'] is True: ... print 'yes' ... yes >>> 

이하 한 당신은 당신이 실제로 파이썬 유형에 JSON 문자열을 디코딩 한 확실한가요? –

+1

jsondata [ 'foo'] [ 'bar']. lower() == 'baz':? lower() 함수에 "baz"를 할당하는 것처럼 보입니다 ... – Powertieke

+0

실제로'drt'를 예상하기 위해'print repr (jsondata)'를 실행해야합니다. 실제로'str'이 아닙니다. (답변을 참조하십시오.) –

답변

2

dict에서 데이터를 가져 오기 전에 dict의 형식과 'z'의 존재 여부를 확인해야합니다. dict.get

>>> jsondata = {'a': '', 'b': {'z': True}, 'c' :{'zz':True}} 
>>> for key in jsondata: 
...  if type(jsondata[key]) is dict and jsondata[key].get('z',False): 
...   print 'yes' 
... 
yes 
>>> 
1

=이 누락되어 실제로 평등을 확인하는 대신 진술 문을 SyntaxError: can't assign to function call으로 변경해야합니다.

표시 한 코드를 실행할 때 TypeError가 표시되지 않으므로 먼저 누락 된 =을 수정하고 그 후에 Stacktrace가 말한 내용을 확인하는 것이 좋습니다.

그러나 jsondata가 디코딩되지 않았으므로 여전히 일반 텍스트 일 ​​수 있습니다. 그러면 물론 인덱스 작성 오류가 발생합니다.

+0

죄송합니다. 오타를 수정했습니다. –

3

Marcelo와 Ivo가 말한 것처럼, json.loads(my_json_string)을 통해 먼저 파이썬으로 구문 분석하지 않고 원시 JSON 문자열에 액세스하려는 것 같습니다.

+0

Yupp. 방금 JSON에 str으로 액세스하려했는데 왜 학교에서 C#을 가르치지 않습니까? –