2016-06-17 9 views
0

Ich habe dieses JSON codierten Text:Wie dekodieren JSON, wo die Werte in den Zeilen getrennt sind

{"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}} 

ich es in Python entschlüsseln will, und ich habe versucht, dies:

with open("log.txt") as log: 
    data = log.read() 
    jsondata = json.loads(data) 

Aber ich bekomme diese Fehlermeldung:

json.decoder.JSONDecodeError: Extra data: line 2 column 1 (char 82) 

ich möchte Daten wie

analysieren
['port']['time']['player'] 

Könnte mir jemand helfen, weil ich das bald brauche?

+0

In Ihrem Beispiel Eingabe jede Zeile ist ein gültiges Json Dokument, so Sie sollten Ihre Eingabe für jede neue Zeile aufteilen und sie separat analysieren. – syntonym

Antwort

0

Ich würde so etwas tun:

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'])) 
+0

bekommen gleichen Fehler ... –

+0

Können Sie einen Link zu Ihrer Datei log.txt, wie ich es gerade kopiert und in TXT-Datei zum Testen eingefügt? Vielleicht Datei ist nicht gut formatiert, da dies perfekt auf meinem Rechner läuft ... – Teemo

+0

sicher, die Zeilen, die ich geschrieben habe, sind nur ein paar der Datei! https://cdn.discordapp.com/attachments/145631855947939841/193366587917598721/log.txt –

1

Das Problem ist, dass Sie mehr jsons in der Datei haben, nicht nur eine. Teilen Sie den Text mit dem Trennzeichen "\ n" und rufen Sie dann json.loads für jede Zeile auf.

4

json.loads lädt ein einzelnes JSON-Objekt. In Ihrem Fall enthält log.txt mehrere JSON-Objekte, die durch "\n" getrennt sind. Sie können in der Datei über die Zeilen iterieren und json.loads auf jeden von ihnen nennen:

with open("log.txt") as log: 
    jsondata = [json.loads(line) for line in log] 
+1

'Liste (Karte (json.loads, log))' könnte auch funktionieren –

+0

muss ich den Schritt überspringen, der die Datei liest? –

+0

@StamKaly, wenn Sie über ein Dateiobjekt iterieren (entweder explizit mit '[... für Zeile im Protokoll]' oder implizit mit 'map (json.loads, log)', wird die Datei gelesen. Iterieren über eine Datei Objekt liest es Zeile für Zeile und geben Sie jede Zeile –