每一行都是有效的JSON,但我需要整个文件才能成为有效的JSON。
我有一些数据是从Web服务聚合并转储到文件中的,因此它是JSON-eaque但不是有效的JSON,所以它不能以简单直观的方式处理JSON文件可以 - 从而构成一个主要的痛苦,它看起来(或多或少)像这样:
{"record":"value0","block":"0x79"}
{"record":"value1","block":"0x80"}
我一直试图将其重新解释为有效的JSON,我最近的尝试看起来像这样:
with open('toy.json') as inpt:
lines = []
for line in inpt:
if line.startswith('{'): # block starts
lines.append(line)
然而,正如你可以推断出我提出这个问题的事实 - 你做不了 - 关于我如何解决这个问题的任何想法?
修改
试过这个:
with open('toy_two.json', 'rb') as inpt:
lines = [json.loads(line) for line in inpt]
print(lines['record'])
但出现以下错误:
Traceback (most recent call last):
File "json-ifier.py", line 38, in <module>
print(lines['record'])
TypeError: list indices must be integers, not str
理想情况下,我希望能够使用普通的JSON与其进行交互,即data['value']
编辑II
with open('transactions000000000029.json', 'rb') as inpt:
lines = [json.loads(line) for line in inpt]
for line in lines:
records = [item['hash'] for item in lines]
for item in records:
print item
答案 0 :(得分:2)
每一行看起来都像一个有效的JSON文档。
这是“JSON Lines”格式(http://jsonlines.org/)
尝试独立处理每一行(json.loads(line)
)或使用专门的库(https://jsonlines.readthedocs.io/en/latest/)。
def process(oneline):
# do what you want with each line
print(oneline['record'])
with open('toy_two.json', 'rb') as inpt:
for line in inpt:
process(json.loads(line))
答案 1 :(得分:2)
这看起来像我最近一直在使用的NDJSON。规范是here,我不确定它的用处。以下是否有效?
with open('the file.json', 'rb') as infile:
data = infile.readlines()
data = [json.loads(item.replace('\n', '')) for item in data]
这应该会给你一个词典列表。