<p>问题是jsonStr是一个字符串,它用JSON编码一些对象,而不是实际的对象。</p>
<p>显然,你知道这是一个字符串,因为你称它为<code>jsonStr</code>。事实证明这条线是有效的:</p>
<pre><code>jsonStr = data.decode("utf-8")
</code></pre>
<p>所以,<code>jsonStr</code>是一个字符串。对字符串调用<code>json.dumps</code>是完全合法的。不管该字符串是某个对象的JSON编码,还是您的姓氏;您都可以用JSON编码该字符串。然后你可以解码这个字符串,得到原始字符串。</p>
<p>所以,这个:</p>
<pre><code>j = json.loads(json.dumps(jsonStr))
</code></pre>
<p>…将返回与<code>j</code>中的<code>jsonStr</code>完全相同的字符串。你还没有把它解码成原始对象。</p>
<p>要做到这一点,不要做额外的编码:</p>
<pre><code>j = json.loads(jsonStr)
</code></pre>
<p>如果不清楚,请尝试使用交互式终端:</p>
<pre><code>>>> 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
</code></pre>