2017-08-23 7 views
0

おはようございます。 jsonファイルにリストのデータを書き込むpythonスクリプトがあります。スクリプトはリストを繰り返してjsonファイルを書きますが、動作しますが問題はあります:ルート要素も繰り返し取得され、jsonファイルで何千回も書き込まれて無効になります。jsonをpythonで複数のルート要素をエンコードして繰り返します

{ 
    "acList": [ 
     { 
    "GAlt": 33975, 
    "Mlat": false, 
    "Tisb": false, 
    "Trt": 1, 
    "Help": false, 
    "InHg": 0, 
    "CallSus": false, 
    "Long": 17.1752, 
    "TrkH": false, 
    "Icao": "02A196", 
    "Sqk": "3710", 
    "Call": "TU217", 
    "Trak": 261, 
    "Gnd": false, 
    "Lat": 37.8024, 
    "Vsi": 0, 
    "Alt": 33975, 
    "AltT": 0, 
    "Spd": 428, 
    "SpdTyp": 0, 
    "VsiT": 0 
    } 
] 
    }{ 
    "acList": [ 
     { 
    "GAlt": 0, 
    "Mlat": false, 
    "Tisb": false, 
    "Trt": 1, 
    "Help": false, 
    "InHg": 0, 
    "CallSus": false, 
    "Long": 14.4933, 
    "TrkH": false, 
    "Icao": "4D2027", 
    "Sqk": "2704", 
    "Call": "KM103", 
    "Trak": 113, 
    "Gnd": false, 
    "Lat": 35.8478, 
    "Vsi": 0, 
    "Alt": 0, 
    "AltT": 0, 
    "Spd": 0, 
    "SpdTyp": 0, 
    "VsiT": 0 
    } 
] 
}{ 

あなたは、私は繰り返し、繰り返しルート要素を持って見ることができるように:これは私が得るものですが

{ 
    "acList": [{ 
     "Icao": "400025", 
     "Alt": 24475, 
     "GAlt": 24475, 
     "AltT": 0, 
     "Call": "TEST1234", 
     "Tisb": false, 
     "TrkH": false, 
     "Sqk": "0644", 
     "Help": false, 
     "VsiT": 0, 
     "Gnd": false, 
     "SpdTyp": 0, 
     "CallSus": false, 
     "Trt": 1 
    }, 
    { 
    "Icao": "49528A", 
    "Alt": 17375, 
    "GAlt": 17632, 
    "InHg": 30.177166, 
    "AltT": 0, 
    "Call": "TAP362", 
    "Lat": 50.813118, 
    "Long": -1.117325, 
    "Mlat": false, 
    "Tisb": false, 
    "Spd": 357.0, 
    "Trak": 39.9, 
    "TrkH": false, 
    "Sqk": "7473", 
    "Help": false, 
    "Vsi": -1472, 
    "VsiT": 0, 
    "Gnd": false, 
    "SpdTyp": 0, 
    "CallSus": false, 
    "Trt": 2 
    }] 
} 

: これはJSONがどのように見えるべきかの部分です。私が達成すべきことは、最初の1つのルート要素と正しい句読点だけを保持することです。これはPythonの私の実際のコードです:

count = 0 
for hex in keys: 
    data = { 
     "acList": [{ 
     "Icao": icao[count], 
     "Alt": alt[count], 
     "GAlt": alt[count], 
     "InHg": 0, 
     "AltT": 0, 
     "Call": call[count], 
     "Lat": lat[count], 
     "Long": long[count], 
     "Mlat": False, 
     "Tisb": False, 
     "Spd": speed[count], 
     "Trak": track[count], 
     "TrkH": False, 
     "Sqk": sqk[count], 
     "Help": False, 
     "Vsi": vsi[count], 
     "VsiT": 0, 
     "Gnd": False, 
     "SpdTyp": 0, 
     "CallSus": False, 
     "Trt": count + 1 
     }] 
    } 
    count = count + 1 
    jsonData = json.dumps(data, indent=2, separators=(',', ': ')) 
    print(jsonData) 
    with open('aircraft.json', 'a') as f: 
     f.write(jsonData) 

ごめんなさい、非常に長い投稿、私はあなたが私を助けることを願っています。ありがとうございました!

+0

なぜ個々のファイルに追加を行っていますか?このように有効なjsonを生成するのは難しいでしょう。むしろ、メモリ内にデータ構造を構築してから、すべてをjson *にシリアル化してください。 –

+0

forループはdictsの単一のリストを作成する必要があります。このリストはrootのdict: 'data = {'acList':lst}'に追加されます。最後に、ルート辞書をファイルにダンプする必要があります。 – ekhumoro

答えて

1

コメントで言えば、ループの論理は間違っています。 JSON文字列を期待どおりに出力するには、dataターゲットはdata=dict(acList=[object ...])のような構造にする必要があります。あなたのケースでは、ループを必要としない場合でも、リストの理解で十分です:

data = dict(acList=[ 
    { 
    "Icao": icao[count], 
    "Alt": alt[count], 
    "GAlt": alt[count], 
    "InHg": 0, 
    "AltT": 0, 
    "Call": call[count], 
    "Lat": lat[count], 
    "Long": long[count], 
    "Mlat": False, 
    "Tisb": False, 
    "Spd": speed[count], 
    "Trak": track[count], 
    "TrkH": False, 
    .... 
    } for count in len(keys)] 
) 

ありがとう。

関連する問題