关于python:使用多个JSON对象加载和解析JSON文件

Loading and parsing a JSON file with multiple JSON objects

我正在尝试在Python中加载和解析JSON文件。 但是我在尝试加载文件时遇到了麻烦:

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

产量:

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

我看着18.2。 json — Python文档中的JSON编码器和解码器,但是通读这个看上去糟透了的文档非常令人沮丧。

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

1
2
3
4
5
{"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"}

您有一个JSON Lines格式的文本文件。您需要逐行解析文件:

1
2
3
4
5
6
import json

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

每行都包含有效的JSON,但总的来说,它不是有效的JSON值,因为没有顶级列表或对象定义。

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

如果您有一个文件,其中包含带有分隔符的单个JSON对象,请使用如何使用json模块一次读取一个JSON对象?使用缓冲方法解析单个对象。


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


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