TypeError:使用Python解析JSON时,字符串索引必须是整数?

时间:2013-11-19 23:59:45

标签: python json parsing

我现在很困惑为什么我无法解析这个JSON字符串。类似的代码在其他JSON字符串上工作正常,但在这一个上没有 - 我试图解析JSON字符串并从JSON中提取脚本。

以下是我的代码。

for step in steps:
    step_path = '/example/v1' +'/'+step

    data, stat = zk.get(step_path)
    jsonStr = data.decode("utf-8")
    print(jsonStr)
    j = json.loads(json.dumps(jsonStr))
    print(j)
    shell_script = j['script']
    print(shell_script)

所以第一个print(jsonStr)会打印出类似的内容 -

{"script":"#!/bin/bash\necho Hello world1\n"}

第二个print(j)将打印出类似的内容 -

{"script":"#!/bin/bash\necho Hello world1\n"}

然后第三个打印件没有打印出来并且出现此错误 -

Traceback (most recent call last):
  File "test5.py", line 33, in <module>
    shell_script = j['script']
TypeError: string indices must be integers

所以我想知道我在这里做错了什么?

我使用上面相同的代码来解析JSON,它工作正常..

2 个答案:

答案 0 :(得分:27)

问题是jsonStr是一个字符串,用于编码JSON中的某个对象,而不是实际的对象。

你显然知道它是一个字符串,因为你称之为jsonStr。事实证明,这条线可以运作:

jsonStr = data.decode("utf-8")

所以,jsonStr是一个字符串。在字符串上调用json.dumps是完全合法的。该字符串是否是某个对象的JSON编码或您的姓氏并不重要;你可以用JSON编码该字符串。然后你可以解码那个字符串,找回原来的字符串。

所以,这个:

j = json.loads(json.dumps(jsonStr))

...将在jsonStr中返回与j完全相同的字符串。你还没有解码到原始对象。

要做到这一点,就不要做额外的编码:

j = json.loads(jsonStr)

如果不清楚,请尝试使用互动终端:

>>> obj = ['abc', {'a': 1, 'b': 2}]
>>> type(obj)
list
>>> obj[1]['b']
2
>>> j = json.dumps(obj)
>>> type(j)
str
>>> j[1]['b']
TypeError: string indices must be integers
>>> jj = json.dumps(j)
>>> type(jj)
str
>>> j
'["abc", {"a": 1, "b": 2}]'
>>> jj
'"[\\"abc\\", {\\"a\\": 1, \\"b\\": 2}]"'
>>> json.loads(j)
['abc', {'a': 1, 'b': 2}]
>>> json.loads(j) == obj
True
>>> json.loads(jj)
'["abc", {"a": 1, "b": 2}]'
>>> json.loads(jj) == j
True
>>> json.loads(jj) == obj
False

答案 1 :(得分:17)

尝试将j = json.loads(json.dumps(jsonStr))替换为j = json.loads(jsonStr)