2017-08-23 8 views
0

大家好, 我有一個python腳本,它將一些列表數據寫入json文件。腳本在列表中迭代並寫入json文件,但它有效,但我遇到了一個問題:根元素也被迭代,並且它在json文件中被寫入了數千次,因此它變得無效。 這部分應該JSON怎麼樣子:使用python編寫和迭代json,但使用多個根元素

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

雖然這是我所得到的:

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

正如你可以看到我有反覆,反覆的根元素。我應該做的只是保留第一個根元素和正確的標點符號。這是我在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列表。這個列表應該被添加到根詞典中:'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)] 
) 

謝謝。