Python 如何在值以行分隔的情况下解码JSON
我有这个JSON编码的文本:Python 如何在值以行分隔的情况下解码JSON,python,json,python-3.x,Python,Json,Python 3.x,我有这个JSON编码的文本: {"port":27277,"velocityX":-0.4,"time":199888,"powerup":"Wall","player":0,"positionX":2331,"velocityY":4.2,"positionY":1130,"type":"powerupUse"} {"port":27277,"velocityX":0,"time":199921,"powerup":"Homing Missile","player":0,"positionX"
{"port":27277,"velocityX":-0.4,"time":199888,"powerup":"Wall","player":0,"positionX":2331,"velocityY":4.2,"positionY":1130,"type":"powerupUse"}
{"port":27277,"velocityX":0,"time":199921,"powerup":"Homing Missile","player":0,"positionX":2319,"velocityY":0,"positionY":1179,"type":"powerupPickup"}
{"port":27277,"time":200032,"type":"pingSummary","pingByPlayer":{"0":0}}
{"port":27277,"velocityX":0.37,"time":201784,"powerup":"Homing Missile","player":0,"positionX":2346.61,"velocityY":4.25,"positionY":1123.58,"type":"powerupUse"}
{"port":27277,"time":202623,"player":0,"target":"turret","xp":1,"type":"structureDamage","exactXp":1.8466638326644897}
{"port":27277,"time":202623,"player":0,"target":"turret","xp":10,"type":"structureDestroy"}
{"port":27277,"time":202936,"player":0,"target":"turret","xp":2,"type":"structureDamage","exactXp":2.9056427478790283}
{"port":27277,"time":203171,"player":0,"target":"turret","xp":4,"type":"structureDamage","exactXp":4.7512664794921875}
{"port":27277,"time":205034,"type":"pingSummary","pingByPlayer":{"0":0}}
我想用Python对其进行解码,并尝试了以下方法:
with open("log.txt") as log:
data = log.read()
jsondata = json.loads(data)
但我得到了这个错误:
json.decoder.JSONDecodeError: Extra data: line 2 column 1 (char 82)
我想像这样解析数据
['port']['time']['player']
有人能帮我吗,因为我很快就需要这个吗?问题是文件中有更多的JSON,而不是只有一个。用“\n”分隔符拆分文本,然后为每一行调用json.loads。问题是文件中有更多的json,而不是只有一个。使用“\n”分隔符拆分文本,然后为每行调用json.loads。
json.loads
加载单个json对象。在您的例子中,log.txt
包含多个JSON对象,由“\n”
分隔。您可以迭代文件中的行并调用json。对每行加载
:
with open("log.txt") as log:
jsondata = [json.loads(line) for line in log]
json.load
加载单个json对象。在您的例子中,log.txt
包含多个JSON对象,由“\n”
分隔。您可以迭代文件中的行并调用json。对每行加载
:
with open("log.txt") as log:
jsondata = [json.loads(line) for line in log]
我会这样做:
import json
jsondata = 0
with open("log.txt") as log_file:
jsondata = [json.loads(line) for line in log_file]
for line in jsondata:
if 'port' in line:
print("Port: {}".format(line['port']))
if 'time' in line:
print("Time: {}".format(line['time']))
if 'player' in line:
print("Player: {}".format(line['player']))
我会这样做:
import json
jsondata = 0
with open("log.txt") as log_file:
jsondata = [json.loads(line) for line in log_file]
for line in jsondata:
if 'port' in line:
print("Port: {}".format(line['port']))
if 'time' in line:
print("Time: {}".format(line['time']))
if 'player' in line:
print("Player: {}".format(line['player']))
在您的示例输入中,每一行都是一个有效的json文档,因此您应该在每一行上拆分输入并分别进行解析。在您的示例输入中,每一行都是一个有效的json文档,因此您应该在每一行上拆分输入并分别进行解析。您能否提供指向log.txt文件的链接,因为我刚刚复制了它并粘贴到txt文件中进行测试?也许文件格式不好,因为这在我的机器上运行得很好…当然,我发布的行只是文件中的一小部分!我研究了你的文件,我必须告诉你,你的JSON是无效的。去手动错误地检查错误,因为我试图对它进行编码,甚至在json.loads失败之后。你能提供指向你的log.txt文件的链接吗,因为我刚刚复制了它并粘贴到txt文件中进行测试?也许文件格式不好,因为这在我的机器上运行得很好…当然,我发布的行只是文件中的一小部分!我研究了你的文件,我必须告诉你,你的JSON是无效的。去手动错误地检查错误,因为我试图对它进行编码,甚至在json.loads失败之后。@StamKaly,如果您迭代一个文件对象(可以显式地使用
[…for line in log]
或隐式地使用映射(json.loads,log)
,文件将被读取。迭代一个文件对象会逐行读取它,并产生每一行。@StamKaly,如果您迭代一个文件对象(显式使用[…用于日志中的行]
或隐式使用映射(json.loads,log)
,将读取文件。对文件对象进行迭代,逐行读取文件,并生成每一行。