问题是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