I have a nested Json file that I am trying to convert to a CSV file.
The Json data looks like this:
{
"businessUnitId": 999999,
"lastPollTime": "2021-04-12T18:30:48.703Z",
"totalRecords": 2,
"dispositions": [
{
"dispositionId": 1000,
"dispositionName": "Reservation_Test",
"isActive": true,
"skills": [
{
"skillId": 1,
"mediaTypeId": 3,
"mediaTypeName": "Chat"
},
{
"skillId": 2,
"mediaTypeId": 3,
"mediaTypeName": "Chat"
},
{
"skillId": 3,
"mediaTypeId": 3,
"mediaTypeName": "Chat"
}
]
},
{
"dispositionId": 1001,
"dispositionName": "Cancel Reservation",
"isActive": true,
"skills": [
{
"skillId": 4,
"mediaTypeId": 3,
"mediaTypeName": "Chat"
},
{
"skillId": 5,
"mediaTypeId": 3,
"mediaTypeName": "Chat"
},
{
"skillId": 6,
"mediaTypeId": 3,
"mediaTypeName": "Chat"
},
{
"skillId": 7,
"mediaTypeId": 3,
"mediaTypeName": "Chat"
},
{
"skillId": 8,
"mediaTypeId": 4,
"mediaTypeName": "Phone Call"
},
{
"skillId": 9,
"mediaTypeId": 4,
"mediaTypeName": "Phone Call"
},
{
"skillId": 10,
"mediaTypeId": 4,
"mediaTypeName": "Phone Call"
},
{
"skillId": 11,
"mediaTypeId": 4,
"mediaTypeName": "Phone Call"
}
}
]
}
Here is my Code:
import json
import csv
# Opening JSON file and loading the data
# into the variable data
with open('File.json') as json_file:
data = json.load(json_file)
dispositions = data['dispositions']
# now we will open a file for writing
data_file = open('File.csv', 'w')
# create the csv writer object
csv_writer = csv.writer(data_file)
# Counter variable used for writing
# headers to the CSV file
count = 0
for emp in dispositions:
if count == 0:
# Writing headers of CSV file
header = emp.keys()
csv_writer.writerow(header)
count += 1
# Writing data of CSV file
csv_writer.writerow(emp.values())
data_file.close()
When I run the code this is what I get:
dispositionName isActive skills Reservation_Test TRUE [{'skillId': 1, 'mediaTypeId': 3, 'mediaTypeName': 'Chat'}, {'skillId': 2, 'mediaTypeId': 3, 'mediaTypeName': 'Chat'}, {'skillId': 3, 'mediaTypeId': 3, 'mediaTypeName': 'Chat'}] Cancel Reservation TRUE [{'skillId':4, 'mediaTypeId': 3, 'mediaTypeName': 'Chat'}, {'skillId': 5, 'mediaTypeId': 3, 'mediaTypeName': 'Chat'}, {'skillId': 6, 'mediaTypeId': 3, 'mediaTypeName': 'Chat'}, {'skillId': 7, 'mediaTypeId': 3, 'mediaTypeName': 'Chat'}, {'skillId': 8, 'mediaTypeId': 4, 'mediaTypeName': 'Phone Call'}, {'skillId': 10647567, 'mediaTypeId': 4, 'mediaTypeName': 'Phone Call'}, {'skillId': 10647574, 'mediaTypeId': 4, 'mediaTypeName': 'Phone Call'}, {'skillId': 10647599, 'mediaTypeId': 4, 'mediaTypeName': 'Phone Call'}]
This is what I want:
dispositionId dispositionName isActive SkillId mediaTypeId mediaTypeName
1000 Reservation_Test TRUE 1 3 Chat
1000 Reservation_Test TRUE 2 3 Chat
1000 Reservation_Test TRUE 3 3 Chat
1001 Cancel Reservation TRUE 4 3 Chat
1001 Cancel Reservation TRUE 5 3 Chat
1001 Cancel Reservation TRUE 6 3 Chat
1001 Cancel Reservation TRUE 7 3 Chat
1001 Cancel Reservation TRUE 8 4 Phone Call
1001 Cancel Reservation TRUE 9 4 Phone Call
1001 Cancel Reservation TRUE 10 4 Phone Call
1001 Cancel Reservation TRUE 11 4 Phone Call
I am just not sure how do deal with nested JSON data.
Thanks
You need to have a nested loop for the repeated content. I'd also recommend using the built-in csv.DictWriter
instead of the regular csv.writer
class.
data_file = open('File.csv', 'w')
# Use the first obj to determine the header row
header = [x for x in dispositions[0].keys() if x != "skills"]
header.extend(dispositions[0]["skills"][0].keys())
csv_writer = csv.DictWriter(data_file, fieldnames=header)
csv_writer.write(header)
for emp in dispositions:
# These key/values are common to each nested row
common_fields = {
k: v for k, v in emp.items() if k != "skills"
}
for skill in emp["skills"]:
# Combine the common fields with this skill's key/values
row = {**common_fields, **skill}
csv_writer.write(row)
data_file.close()
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.