Reputation: 1272
I have a set of python lists which I want to serially write in a json file in a structure as given below
[
{
"_id": {
"$oid": "5707b5f4e4b0c4265caf3c87"
},
"TimeStamp": 1,
"TraceData": [
{
"data": {
"y": 443.732,
"angle": 1.11416,
"speed": 1.42906,
"ObjectType": "Pedestrians",
"x": 217.991,
"D2D": "DUE_1_2"
},
"id": "DUE_1_1"
},
{
"data": {
"y": 571.965,
"angle": 1.22555,
"speed": 1.18132,
"ObjectType": "Pedestrians",
"x": 205.708,
"D2D": "DUE_20_1"
},
"id": "DUE_20_2"
}
]
},
{
"_id": {
"$oid": "5707b5a8e4b0a37fb1a38c57"
},
"TimeStamp": 2,
"TraceData": [
{
"data": {
"y": 419.936,
"angle": 1.21995,
"speed": 1.38648,
"ObjectType": "Pedestrians",
"x": 153.693,
"D2D": "DUE_1_2"
},
"id": "DUE_1_1"
},
{
"data": {
"y": 571.143,
"angle": 1.0939,
"speed": 1.31394,
"ObjectType": "Pedestrians",
"x": 295.097,
"D2D": "DUE_20_1"
},
"id": "DUE_20_2"
}
]
}
]
I have python lists for each of the variables ('y','x','angle','speed' etc.). and I have created nested dictionaries in python to write these lists via a FOR loop. The code is as follows
for eachdata in range(index-1):
OuterDict['TimeStamp']['TraceData']['data']['x'] = lat[eachdata]
OuterDict['TimeStamp']['TraceData']['data']['y'] = long[eachdata]
OuterDict['TimeStamp']['TraceData']['data']['angle'] = angle[eachdata]
OuterDict['TimeStamp']['TraceData']['data']['speed'] = speed[eachdata]
OuterDict['TimeStamp']['TraceData']['data']['ObjectType'] = ObjectType[eachdata]
index = 0
out_file = open("klsimulationjson.js","w")
json.dump(OuterDict,out_file,indent = 4)
out_file.close()
This code produces the following result. I am not able to figure out 1) how to iteratively populate the dictionary in the similar structure 2) adding values to the key 'TimeStamp'# 3) creating the key - 'id'
{
"TimeStamp": {
"TraceData": {
"data": {
"x": "7.739439",
"speed": "6.072069",
"y": "49.421938",
"ObjectType": "Bus",
"angle": "68.576206"
}
}
}
}
Thank you for your help
Upvotes: 0
Views: 1359
Reputation: 1358
I am assuming this is what you wanted, since you can't have a dict {}
holding values with no keys:
[{
"TimeStamp": 1,
"TraceData": [{
"data": {
"y": 443.732,
"angle": 1.11416,
"speed": 1.42906,
"ObjectType": "Pedestrians",
"x": 217.991,
"D2D": "DUE_1_2"
},
"id": "DUE_1_1"
}, {
"data": {
"y": 430.645,
"angle": 1.07287,
"speed": 1.41977,
"ObjectType": "Pedestrians",
"x": 234.104,
"D2D": "DUE_1_1"
},
"id": "DUE_1_2"
}, {
"data": {
"y": 362.25,
"angle": 1.43214,
"speed": 1.44059,
"ObjectType": "Pedestrians",
"x": 50.5509,
"D2D": "DUE_2_2"
},
"id": "DUE_2_1"
}]
}, {
"TimeStamp": 2,
"TraceData": [{
"data": {
"y": 443.732,
"angle": 1.11416,
"speed": 1.42906,
"ObjectType": "Pedestrians",
"x": 217.991,
"D2D": "DUE_1_2"
},
"id": "DUE_1_1"
}, {
"data": {
"y": 430.645,
"angle": 1.07287,
"speed": 1.41977,
"ObjectType": "Pedestrians",
"x": 234.104,
"D2D": "DUE_1_1"
},
"id": "DUE_1_2"
}, {
"data": {
"y": 362.25,
"angle": 1.43214,
"speed": 1.44059,
"ObjectType": "Pedestrians",
"x": 50.5509,
"D2D": "DUE_2_2"
},
"id": "DUE_2_1"
}]
}]
So, basically a list []
of dicts {}
(#1), each with an identifying "TimeStamp", and a "TraceData" list []
that also contains dicts {}
(#2), each of which contains an "id", and "data".
Your code:
for eachdata in range(index-1):
OuterDict['TimeStamp']['TraceData']['data']['x'] = lat[eachdata]
OuterDict['TimeStamp']['TraceData']['data']['y'] = long[eachdata]
OuterDict['TimeStamp']['TraceData']['data']['angle'] = angle[eachdata]
OuterDict['TimeStamp']['TraceData']['data']['speed'] = speed[eachdata]
OuterDict['TimeStamp']['TraceData']['data']['ObjectType'] = ObjectType[eachdata]
Looks at a single dict (of type #1), and then does several errors:
{}
, but you access it as a dict anyways.[]
, so you need to access it as such - it might contain more than one dict {}
(#2), in fact it does in your example. This is how it should be accessed when properly built, more or less, so you can get an idea how to fix your code:
for traceFrame in traceFrames:
print(traceFrame["TimeStamp"])
for traceData in traceFrame["TraceData"]:
print(traceData["id"], " --> ", traceData["data"])
Upvotes: 1