【问题标题】:create valid json object in python在python中创建有效的json对象
【发布时间】:2018-02-25 15:12:23
【问题描述】:

每一行都是有效的 JSON,但我需要整个文件都是有效的 JSON。

我有一些从 Web 服务聚合并转储到文件中的数据,因此它是 JSON 格式的,但不是有效的 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']

编辑二

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

【问题讨论】:

  • 每一行都是有效的 JSON 吗?例如:lines = [json.loads(line) for line in inpt] 能完成这项工作吗?
  • lines.append(json.loads(line))?
  • 是的,但我不想处理每一行——我想将文件作为一个整体处理——真正的文件有数百万条记录
  • [json.loads(line) for line in inpt]在什么方面不构成“将文件作为一个整体处理”?
  • 我现在很困惑。如果这个文件有效的 JSON,它会是一个列表,对吧?你想把它解释成什么类型​​?

标签: python json


【解决方案1】:

这看起来像我最近一直在使用的 NDJSON。规范是here,我不确定它的用处。以下是否有效?

with open('the file.json', 'rb') as infile:
    data = infile.readlines()
    data = [json.loads(item.replace('\n', '')) for item in data] 

这应该会给你一个字典列表。

【讨论】:

  • 我刚刚尝试的时候收到了这个错误print(data['record']) TypeError: list indices must be integers, not str,我该如何验证它是否有效?
  • 因为这会解析文件并为您提供字典列表,而不是字典。
  • 但我想像使用 json 一样与它进行交互,在普通 json 中我可以调用 data['record'] 之类的东西,你知道我的意思吗?
  • 该死-很抱歉,这正是data[0]['record']-谢谢您的大力帮助!~ :)
  • @s.matthew.english 它仍然是一个列表,所以items() 不在了。 records = [item['record'] for item in data] 应该这样做吗?我猜格式的重点是每一行都是有效的 json,但文件作为一个整体不是。我也觉得这有点不舒服,但你确实只有一个字典列表,所以如果你知道如何遍历列表并按键抓取东西,那还不错。
【解决方案2】:

每一行看起来都像是一个有效的 JSON 文档。

这是“JSON 行”格式 (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))

【讨论】:

  • 我想将文件作为一个整体进行处理——因为真正的文件有数百万条记录
  • 所以?您可以像在代码中那样迭代输入文件的每一行,然后在“for”循环中应用 json.loads(line)。
  • 听起来很贵,我想做又便宜又快
  • 如果您将所有已解析的行存储在一个全局列表中,是的,这在 RAM 中会很昂贵。如果您独立处理每一行,那么您只为当前行使用一点内存。这就是“基于流的编程”。
  • 好吧,这只是data[0]['record'] 的问题-无论如何-谢谢你提供这些伟大的见解!
猜你喜欢
  • 2015-07-06
  • 1970-01-01
  • 2017-05-23
  • 1970-01-01
  • 2019-06-02
  • 2016-10-19
  • 1970-01-01
  • 2021-10-22
  • 1970-01-01
相关资源
最近更新 更多