简体   繁体   中英

Convert nested JSON file to CSV in Python

I have a json file which contains nested keys and values.My requirement is to have the data in csv format and the csv file should contain below details

name title emails updatTime roles

Here is my code:

import json
import csv
with open ("D:\Python_Tolusko/IICS_Users.json") as file:
        data=json.load(file)

fname='D:\Python_Tolusko/output.csv'

with open(fname,"w") as file:
        csv_file=csv.writer(file)
        csv_file.writerow(["name","title","emails","updateTime","roles"])
        for item in data:
                csv_file.writerow([item['name'],item['title'],item['emails'],item['updateTime'],item['roles']['name']])
                #rec=(value for value in data.roles.name())
                #csv_file.writerow(rec)

However on running the code I am getting below error

TypeError                                 Traceback (most recent call last)
<ipython-input-2-e810dd9e7ace> in <module>
     11         csv_file.writerow(["name","title","emails","updateTime","roles"])
     12         for item in data:
---> 13                 csv_file.writerow([item['name'],item['title'],item['emails'],item['updateTime'],item['roles']['name']])
     14                 #rec=(value for value in data.roles.name())
     15                 #csv_file.writerow(rec)

TypeError: list indices must be integers or slices, not str

I tried updating the integer in

csv_file.writerow([item['name'],item['title'],item['emails'],item['updateTime'],item['roles'][1]])

 File "<ipython-input-3-6e39021aca6a>", line 13
    csv_file.writerow([item['name'],item['title'],item['emails'],item['updateTime'],item['roles'][1])
                                                                                                    ^
SyntaxError: invalid syntax

Please find the below JSON output

[
  {
    "@type": "user",
    "id": "017Q3A0300000000000C",
    "name": "Abc",
    "updateTime": "2021-04-07T09:54:06.000Z",
    "title": "Dev",
    "password": "********",
    "phone": "9999999999",
    "emails": "abc@gmail.com",
    "roles": [
      {
        "@type": "role",
        "name": "MDM Business User",
        "description": "Role used for MDM C360 Business Application runtime."
      },
      {
        "@type": "role",
        "name": "Customer 360 Data Steward",
        "description": "MDM Customer 360 Data Steward"
      },
      {
        "@type": "role",
        "name": "Data Viewer",
        "description": "Role used for granting access for data"
      },
      {
        "@type": "role",
        "name": "Designer",
        "description": "Role for creating assets, tasks, and processes. Can configure connections, schedules, and runtime environments. Has access to the Application Integration Console."
      },
      {
        "@type": "role",
        "name": "Business Manager",
        "description": "Role used for business managers"
      },
      {
        "@type": "role",
        "name": "MDM Designer",
        "description": "MDM Designer"
      },
      {
        "@type": "role",
        "name": "Admin",
        "description": "Role for performing administrative tasks for an organization. Has full access to all licensed services."
      },
      {
        "@type": "role",
        "name": "Deployer",
        "description": "Role used by deployer"
      },
      {
        "@type": "role",
        "name": "Operator",
        "description": "Role used for monitoring execution environments"
      },
      {
        "@type": "role",
        "name": "Monitor",
        "description": "Role used for application monitor"
      },
      {
        "@type": "role",
        "name": "Customer 360 Manager",
        "description": "MDM Customer 360 Manager"
      },
      {
        "@type": "role",
        "name": "Data Preview",
        "description": "Role to preview data"
      },
      {
        "@type": "role",
        "name": "Service Consumer",
        "description": "Role for running tasks, taskflows, and processes."
      },
      {
        "@type": "role",
        "name": "Customer 360 Analyst",
        "description": "MDM Customer 360 Analyst"
      },
      {
        "@type": "role",
        "name": "Data Integration Task Executor",
        "description": "Role to run Data Integration tasks"
      }
    ]
  },
  {
    "@type": "user",
    "id": "017Q3A03000000000002",
    "name": "Admin",
    "updateTime": "2021-05-28T12:51:44.000Z",
    "title": "Admin",
    "password": "********",
    "phone": "9999999999",
    "emails": "Admin@123.com",

    "roles": [
      {
        "@type": "role",
        "name": "Designer",
        "description": "Role for creating assets, tasks, and processes. Can configure connections, schedules, and runtime environments. Has access to the Application Integration Console."
      }
    ]
  },
  {
    "@type": "user",
    "id": "017Q3A0300000000000G",
    "orgId": "017Q3A",
    "name": "Xyz",
    "title": "Developer",
    "password": "********",
    "phone": "9999999999",
    "emails": "xyz@123.com",
    
    "roles": [
      {
        "@type": "role",
        "name": "Customer 360 Manager",
        "description": "MDM Customer 360 Manager"
      },
      {
        "@type": "role",
        "name": "Data Preview",
        "description": "Role to preview data"
      },
      {
        "@type": "role",
        "name": "Designer",
        "description": "Role for creating assets, tasks, and processes. Can configure connections, schedules, and runtime environments. Has access to the Application Integration Console."
      },
      {
        "@type": "role",
        "name": "Data Viewer",
        "description": "Role used for granting access for data"
      },
      {
        "@type": "role",
        "name": "Data Integration Task Executor",
        "description": "Role to run Data Integration tasks"
      },
      {
        "@type": "role",
        "name": "Admin",
        "description": "Role for performing administrative tasks for an organization. Has full access to all licensed services."
      },
      {
        "@type": "role",
        "name": "Customer 360 Data Steward",
        "description": "MDM Customer 360 Data Steward"
      },
      {
        "@type": "role",
        "name": "Service Consumer",
        "description": "Role for running tasks, taskflows, and processes."
      },
      {
        "@type": "role",
        "name": "MDM Designer",
        "description": "MDM Designer"
      },
      {
        "@type": "role",
        "name": "MDM Business User",
        "description": "Role used for MDM C360 Business Application runtime."
      },
      {
        "@type": "role",
        "name": "Customer 360 Analyst",
        "description": "MDM Customer 360 Analyst"
      },
      {
        "@type": "role",
        "name": "Monitor",
        "description": "Role used for application monitor"
      },
      {
        "@type": "role",
        "name": "Business Manager",
        "description": "Role used for business managers"
      },
      {
        "@type": "role",
        "name": "Deployer",
        "description": "Role used by deployer"
      },
      {
        "@type": "role",
        "name": "Operator",
        "description": "Role used for monitoring execution environments"
      }
    ]
  }
]

PLease help how I can have desired role for the corresponding user

Thanks in Advance.

There are missing fields in your data, if they should be, I would suggest using .get option for dictionary

Something like that

jsonfile = open('data.json', 'r').read()
csvfile = open('data.csv', 'w', newline='')
rows = json.loads(jsonfile)
output = []
for row in rows:
    outrow = [row.get('name'),
              row.get('title'),
              row.get('emails'),
              row.get('updateTime'),
              row.get('roles')]
    output.append(outrow)
writer = csv.writer(csvfile)
writer.writerows(output)

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM