我有一个名为debug.json的JSON文件,我在Python3.3中创建了如下所示:
{"TIME": 55.55, "ID":155,"DATA": [17,22,33,44,55]}{"TIME": 56.55, "ID":195,"DATA": [17,22,ff,44,55]}
我正在尝试使用以下代码加载它:
import json
with open("debug.json",'r',encoding='utf-8') as f:
testing = json.loads(f.read())
但是,当我尝试这个时,我收到以下错误:
ValueError: Extra data line 1 column 92
这是第二个JSON对象在文本文件中开始的地方......我猜我错过了一些非常简单的东西,但我没有找到任何与我的问题有关的例子。任何帮助表示赞赏!
答案 0 :(得分:2)
使用json.JSONDecoder.raw_decode
,它在末尾接受带有额外数据的JSON,例如另一个JSON对象,并返回一个元组,其中第一个对象被解码,下一个对象的位置。
您的JSON示例:
import json
js = """{"TIME": 55.55, "ID":155,"DATA": [17,22,33,44,55]}{"TIME": 56.55, "ID":195,"DATA": [17,22,ff,44,55]}"""
json.JSONDecoder().raw_decode(js) # ({'TIME': 55.55, 'DATA': [17, 22, 33, 44, 55], 'ID': 155}, 50)
js[50:] # '{"TIME": 56.55, "ID":195,"DATA": [17,22,ff,44,55]}'
如您所见,它成功解码了第一个对象并告诉我们下一个对象的起始位置(在本例中为第50个字符)。
这是我创建的一个函数,它可以解码多个JSON对象并返回包含所有这些对象的列表:
def multipleJSONDecode(js):
result = []
while js:
obj, pos = json.JSONDecoder().raw_decode(js)
result.append(obj)
js = js[pos:]
return result
答案 1 :(得分:0)
创建文件时,请确保每行最多有一个有效的JSON字符串 。然后,当您需要将它们读回时,您可以一次循环一个文件中的行:
import json
testing = []
with open("debug.json",'r',encoding='utf-8') as f:
for line in f:
testing.append(json.loads(line))