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

2024-09-28 22:24:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我现在很困惑为什么我不能解析这个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,它工作得很好。。


Tags: path字符串代码inbashjson内容data
2条回答

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

显然,你知道这是一个字符串,因为你称它为jsonStr。事实证明这条线是有效的:

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

所以,jsonStr是一个字符串。对字符串调用json.dumps是完全合法的。不管该字符串是某个对象的JSON编码,还是您的姓氏;您都可以用JSON编码该字符串。然后你可以解码这个字符串,得到原始字符串。

所以,这个:

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

…将返回与j中的jsonStr完全相同的字符串。你还没有把它解码成原始对象。

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

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

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

相关问题 更多 >