加载和解析具有多个 JSON 对象的 JSON 文件

Posted

技术标签:

【中文标题】加载和解析具有多个 JSON 对象的 JSON 文件【英文标题】:Loading and parsing a JSON file with multiple JSON objects 【发布时间】:2012-09-09 04:58:26 【问题描述】:

我正在尝试加载和解析Python 中的 JSON 文件。但我一直在尝试加载文件:

import json
json_data = open('file')
data = json.load(json_data)

产量:

ValueError: Extra data: line 2 column 1 - line 225116 column 1 (char 232 - 160128774)

我在 Python 文档中查看了 18.2. json — JSON encoder and decoder,但是阅读这个看起来很糟糕的文档非常令人沮丧。

前几行(以随机条目匿名):

"votes": "funny": 2, "useful": 5, "cool": 1, "user_id": "harveydennis", "name": "Jasmine Graham", "url": "http://example.org/user_details?userid=harveydennis", "average_stars": 3.5, "review_count": 12, "type": "user"
"votes": "funny": 1, "useful": 2, "cool": 4, "user_id": "njohnson", "name": "Zachary Ballard", "url": "https://www.example.com/user_details?userid=njohnson", "average_stars": 3.5, "review_count": 12, "type": "user"
"votes": "funny": 1, "useful": 0, "cool": 4, "user_id": "david06", "name": "Jonathan George", "url": "https://example.com/user_details?userid=david06", "average_stars": 3.5, "review_count": 12, "type": "user"
"votes": "funny": 6, "useful": 5, "cool": 0, "user_id": "santiagoerika", "name": "Amanda Taylor", "url": "https://www.example.com/user_details?userid=santiagoerika", "average_stars": 3.5, "review_count": 12, "type": "user"
"votes": "funny": 1, "useful": 8, "cool": 2, "user_id": "rodriguezdennis", "name": "Jennifer Roach", "url": "http://www.example.com/user_details?userid=rodriguezdennis", "average_stars": 3.5, "review_count": 12, "type": "user"

【问题讨论】:

【参考方案1】:

您有一个JSON Lines format text file。您需要逐行解析文件:

import json

data = []
with open('file') as f:
    for line in f:
        data.append(json.loads(line))

每一都包含有效的JSON,但作为一个整体,它不是一个有效的JSON值,因为没有***列表或对象定义。

请注意,由于文件每行都包含 JSON,因此您不必为尝试一次性解析所有内容或找出流式 JSON 解析器而烦恼。您现在可以选择在继续下一行之前分别处理每一行,从而节省过程中的内存。如果您的文件很大,您可能不想将每个结果附加到一个列表中然后处理所有内容。

如果您的文件包含单个 JSON 对象,中间有分隔符,请使用 How do I use the 'json' module to read in one JSON object at a time? 使用缓冲方法解析出单个对象。

【讨论】:

+1 也许值得注意的是,如果您不需要一次处理所有对象,则一个接一个地处理它们可能是更有效的方法。这样您就不需要将整个数据存储在内存中,而是将其中的一部分存储。 @Pi_:您将拥有一本字典,因此只需将字段作为键访问:data = json.loads(line); print data[u'votes'] @Pi_:打印 json.loads() 的结果然后或者使用调试器检查。 @Pi_:不;不要将 JSON 格式与 python dict 表示混淆。您现在看到的是带有字符串的 python 字典。 @user2441441:请参阅此处帖子中的linked answer。【参考方案2】:

对于那些偶然发现这个问题的人:python jsonlines 库(比这个问题年轻得多)优雅地处理每行一个 json 文档的文件。见https://jsonlines.readthedocs.io/

【讨论】:

【参考方案3】:

如果您使用的是pandas,并且您有兴趣将json 文件加载为数据框,则可以使用:

import pandas as pd
df = pd.read_json('file.json', lines=True)

并将其转换为 json 数组,您可以使用:

df.to_json('new_file.json')

【讨论】:

【参考方案4】:

格式错误。每行有一个 JSON 对象,但它们不包含在更大的数据结构(即数组)中。您需要重新格式化它,使其以[ 开头并以] 结尾,并在每行末尾加上一个逗号,或者将其逐行解析为单独的字典。

【讨论】:

对于 50MB 的文件,OP 最好还是逐行处理数据。 :-) 文件格式是否错误取决于个人观点。如果它打算采用“JSON 行”格式,那么它是有效的。见:jsonlines.org

以上是关于加载和解析具有多个 JSON 对象的 JSON 文件的主要内容,如果未能解决你的问题,请参考以下文章

如何在对象 C 中解析具有多个实例的 JSON [重复]

在 Python 3.4 中加载和读取具有多个 JSON 对象的 JSON 文件

如何在 R 中解析具有堆叠多个 JSON 的文件?

C#中具有多个对象的JSON文件的反序列​​化

如何使用 Swifty 动态创建具有多个键和值的 json 对象

如何解析具有多个值的 json?