<p>如果您始终可以保证您的JSON格式如您的示例所示,即新的JSON对象从最后一个结束的同一行开始,并且没有缩进,那么您只需将JSON读入缓冲区,直到遇到这样的行,然后发送缓冲区进行JSON解析—冲洗和重复:</p>
<pre><code>import json
parsed = [] # a list to hold individually parsed JSON objects
with open('path/to/your.json') as f:
buffer = ''
for line in f:
if line[0] == '}': # end of the current JSON object
parsed.append(json.loads(buffer + '}'))
buffer = line[1:]
else:
buffer += line
print(json.dumps(parsed, indent=2)) # just to make sure it all went well
</code></pre>
<p>会产生:</p>
^{pr2}$
<p>如果您的案例没有那么明确(例如,您无法预测格式),您可以尝试一些迭代/基于事件的JSON解析器(例如<a href="https://pypi.org/project/ijson/" rel="nofollow noreferrer">^{<cd1>}</a>),这些解析器能够在“根”对象关闭后告诉您,以便您可以将解析的JSON对象“拆分”为一个序列。在</p>
<p><strong>更新</strong>:再想一想,除了内置的<code>json</code>模块之外,您不需要任何东西,即使连接的JSON没有正确或缩进,您可以使用<a href="https://docs.python.org/3/library/json.html#json.JSONDecoder.raw_decode" rel="nofollow noreferrer">^{<cd3>}</a>(及其未记录的第二个参数)来遍历数据并以迭代方式寻找有效的JSON结构,直到遍历完整个文件(或遇到错误)。例如:</p>
<pre><code>import json
parser = json.JSONDecoder()
parsed = [] # a list to hold individually parsed JSON structures
with open('test.json') as f:
data = f.read()
head = 0 # hold the current position as we parse
while True:
head = (data.find('{', head) + 1 or data.find('[', head) + 1) - 1
try:
struct, head = parser.raw_decode(data, head)
parsed.append(struct)
except (ValueError, json.JSONDecodeError): # no more valid JSON structures
break
print(json.dumps(parsed, indent=2)) # make sure it all went well
</code></pre>
<p>应该会得到与上面相同的结果,但这次不会依赖于当JSON对象“关闭”时<code>}</code>是新行的第一个字符。它还应该适用于连续堆叠的JSON数组。在</p>