Skip to main content
 首页 » 编程设计

python之如何在python中加载多个json对象

2025年05月04日15lhb25

我在 json 文件中有 10,000 个 json 对象,格式如下:

{ "a": 1, 
  "b" : 2, 
  "c" : { 
          "d":3 
        } 
}{ "e" : 4, 
  "f" : 5, 
  "g" : { 
         "h":6 
        } 
} 

如何将它们作为 json 对象加载?

我尝试过的两种方法都出现了相应的错误:

方法一:

>>> with open('test1.json') as jsonfile: 
...     for line in jsonfile: 
...             data = json.loads(line) 
...  

错误:

Traceback (most recent call last): 
  File "<stdin>", line 3, in <module> 
  File "/usr/lib/python3.5/json/__init__.py", line 319, in loads 
    return _default_decoder.decode(s) 
  File "/usr/lib/python3.5/json/decoder.py", line 339, in decode 
    obj, end = self.raw_decode(s, idx=_w(s, 0).end()) 
  File "/usr/lib/python3.5/json/decoder.py", line 355, in raw_decode 
    obj, end = self.scan_once(s, idx) 
json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 2 column 1 (char 10) 

方法二:

>>> with open('test1.json') as jsonfile: 
...     data = json.load(jsonfile)       
...  

错误:

Traceback (most recent call last): 
  File "<stdin>", line 2, in <module> 
  File "/usr/lib/python3.5/json/__init__.py", line 268, in load 
    parse_constant=parse_constant, object_pairs_hook=object_pairs_hook, **kw) 
  File "/usr/lib/python3.5/json/__init__.py", line 319, in loads 
    return _default_decoder.decode(s) 
  File "/usr/lib/python3.5/json/decoder.py", line 342, in decode 
    raise JSONDecodeError("Extra data", s, end) 
json.decoder.JSONDecodeError: Extra data: line 7 column 1 (char 46) 
>>>  

我已经阅读了相关问题,但都没有帮助。

请您参考如下方法:

您描述的文件内容不是有效的 JSON 对象,这就是机器人方法不起作用的原因。

要转换为可以使用 json.load(fd) 加载的内容,您必须:

  1. 在文件开头添加[
  2. 在每个对象之间添加一个,
  3. 在文件末尾添加]

那么就可以使用方法二了。 例如:

[ { "a": 1, 
    "b" : 2, 
    "c" : { 
      "d":3 
    } 
  }, { "e" : 4, 
       "f" : 5, 
       "g" : { 
         "h":6 
       } 
  } 
] 

是一个有效的 JSON 数组

如果文件格式与您描述的完全一样,您可以这样做

with open(filename, 'r') as infile: 
    data = infile.read() 
    new_data = data.replace('}{', '},{') 
    json_data = json.loads(f'[{new_data}]')