Loading and parsing a JSON file with multiple JSON objects

心已入冬 提交于 2019-11-26 00:15:45

问题


I am trying to load and parse a JSON file in Python. But I\'m stuck trying to load the file:

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

Yields:

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

I looked at 18.2. json — JSON encoder and decoder in the Python documentation, but it\'s pretty discouraging to read through this horrible-looking documentation.

First few lines (anonymized with randomized entries):

{\"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:


You have a JSON Lines format text file. You need to parse your file line by line:

import json

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

Each line contains valid JSON, but as a whole, it is not a valid JSON value as there is no top-level list or object definition.

Note that because the file contains JSON per line, you are saved the headaches of trying to parse it all in one go or to figure out a streaming JSON parser. You can now opt to process each line separately before moving on to the next, saving memory in the process. You probably don't want to append each result to one list and then process everything if your file is really big.

If you have a file containing individual JSON objects with delimiters in-between, use How do I use the 'json' module to read in one JSON object at a time? to parse out individual objects using a buffered method.




回答2:


for those stumbling upon this question: the python jsonlines library (much younger than this question) elegantly. handles files with one json document per line. see https://jsonlines.readthedocs.io/




回答3:


That is ill-formatted. You have one JSON object per line, but they are not contained in a larger data structure (ie an array). You'll either need to reformat it so that it begins with [ and ends with ] with a comma at the end of each line, or parse it line by line as separate dictionaries.



来源:https://stackoverflow.com/questions/12451431/loading-and-parsing-a-json-file-with-multiple-json-objects

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!