简体   繁体   中英

How to convert JSON elements from string to array

I am converting.csv to JSON but the strings are not in a array form, and I need them to be inside an array.

Code I use to convert.csv to JSON:

    def import_passwords(self):
        options = QFileDialog.Options()
        fileName, _ = QFileDialog.getOpenFileName(self,"Passwords", "Passwords","Excel File (*.csv)", options=options)
        if fileName:
            print(fileName)
            csvfile = open(fileName, 'r')
            jsonfile = open(password_dir + 'passwords.json', 'w')

            fieldnames = ("site name","username","password")
            reader = csv.DictReader(csvfile, fieldnames)
            out = json.dumps([row for row in reader])
            # out = out.replace("\\", '')
            # jsonfile.write(out)

            # with open(password_dir + 'passwords.json', mode='w+', encoding='utf-8') as file:
            #     json.dump(out, file)

            # with open(password_dir + 'passwords.json') as file:
            passwords_json = json.loads(out)
            # sort json file
            sorted_obj = sorted(passwords_json, key=lambda x : x['site name'], reverse=False)
            # Write to passwords file
            with open(password_dir + 'passwords.json', mode='w+', encoding='utf-8') as file:
                json.dump(sorted_obj, file, ensure_ascii=True, indent=4, sort_keys=True, separators=(',', ': '))

I have no idea how I would convert them in a efficient way.

What I get:

[
    {
        "password": "asd",
        "site name": "asd",
        "username": "asd"
    },
    {
        "password": "asd",
        "site name": "asdasd",
        "username": "asd"
    },
    {
        "password": "asd",
        "site name": "asdasdasd",
        "username": "asd"
    }
]

What I want:

[
    {
        "password": ["asd"],
        "site name": ["asd"],
        "username": ["asd"]
    },
    {
        "password": ["asd"],
        "site name": ["asdasd"],
        "username": ["asd"]
    },
    {
        "password": ["asd"],
        "site name": ["asdasdasd"],
        "username": ["asd"]
    }
]

I get the as string, and I want array.

you can just do it:

data = [
    {
        "password": "asd",
        "site name": "asd",
        "username": "asd"
    },
    {
        "password": "asd",
        "site name": "asdasd",
        "username": "asd"
    },
    {
        "password": "asd",
        "site name": "asdasdasd",
        "username": "asd"
    }
]


for dic in data:
    for key in dic.keys():
        dic[key] = [dic[key]]

or use list comprehension:

data = [{k: [v] for k,v in d.items()} for d in data]

output:

[{'password': ['asd'], 'site name': ['asd'], 'username': ['asd']}, {'password': ['asd'], 'site name': ['asdasd'], 'username': ['asd']}, {'password': ['asd'], 'site name': ['asdasdasd'], 'username': ['asd']}]

You can loop over the objects in data and convert all of the values to lists:

data = [
    {
        "password": "asd",
        "site name": "asd",
        "username": "asd"
    },
    {
        "password": "asd",
        "site name": "asdasd",
        "username": "asd"
    },
    {
        "password": "asd",
        "site name": "asdasdasd",
        "username": "asd"
    }
]

for x in data:
    for k in x.keys():
        x[k] = [x[k]]

Output:

[
    {
        'password': ['asd'],
        'site name': ['asd'],
        'username': ['asd']
    },
    {
        'password': ['asd'],
        'site name': ['asdasd'],
        'username': ['asd']
    },
    {
        'password': ['asd'],
        'site name': ['asdasdasd'],
        'username': ['asd']
    }
]

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