Я пишу скрипт для замены имени ключа в файле JSON. В настоящее время формат файла json:

{json:data1}
{json:data2}
{json:data3}

Но всякий раз, когда я запускаю свой скрипт

import json

json_data = []
with open('test.json') as f:
    for line in f:
        asjson = json.loads(line)
        asjson['new_keyname'] = asjson.pop('old_keyname')
        json_data.append(asjson)

with open('result.json', 'w') as file:
    json.dump(json_data, file, indent=2)  

Превращается в массив json:

[{json:data1},{json:data2},{json:data3}]

Как изменить имя ключа без изменения формата json?

0
SENTINEL PROJECT 17 Апр 2019 в 11:11

2 ответа

Лучший ответ

Ваш json_data является самим массивом, поэтому он создает дамп в массив. Многострочный текст не является допустимым форматом json, но если вы этого хотите, попробуйте:

with open('result.txt', 'w+') as f:
    for x in json_data:
        f.write(json.dumps(x) + '\n')

# result.txt
{"k3": "v1"}
{"k3": "v2"}
{"k3": "v3"}
0
knh190 17 Апр 2019 в 08:23

Первая проблема заключается в том, что ваш JSON выглядит недействительным. Я не совсем уверен, какие данные вы хотите представить, но по крайней мере вы должны использовать кавычки, т.е.

{"data1": "value1"}

С двумя парами ключ / значение это будет выглядеть так:

{"data1": "value1",
 "data2": "value2"}

Кроме того, нет необходимости разбирать одну строку за раз. Ваш код может выглядеть так:

import json

with open('test.json') as f:
    json_data = json.load(f)

# change key data1 to key1
json_data['key1'] = json_data.pop('data1')

with open('result.json', 'w') as f:
    json.dump(json_data, f, indent=2) 

Это будет непосредственно читать JSON в dict, менять один ключ и записывать его обратно.

0
Jussi Nurminen 17 Апр 2019 в 08:37