我现在很困惑为什么我无法解析这个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,它工作正常..
答案 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)
。