У меня есть файл с таким типом структуры:
{
"key" : "A",
"description" : "1",
"uninterestingInformation" : "whatever"
}
{
"key" : "B",
"description" : "2",
"uninterestingInformation" : "whatever"
}
{
"key" : "C",
"description" : "3",
"uninterestingInformation" : "whatever"
}
Я хочу построить словарь в Python, который содержит ключ как ключ и описание как значение. У меня больше полей, но только 2 из них интересны для меня.
Этот файл не является файлом.json, это файл с большим количеством похожих объектов json.
Очевидно, json.loads не работает.
Любое предложение о том, как читать данные?
Я уже прочитал этот пост, но мой json-объект не на одной строке...
РЕДАКТИРОВАТЬ:
Если в моих объяснениях было непонятно, пример довольно точный, у меня есть много похожих объектов JSON, один за другим, разделенных новой строкой (\n) без запятой. Таким образом, в целом файл не является допустимым файлом JSON, а каждый объект является допустимым объектом JSON.
Решение, которое я применил, наконец:
api_key_file = open('mongo-config.json').read()
api_key_file = '[' + api_key_file + ']'
api_key_file= api_key_file.replace("}\n{", "},\n{")
api_key_data = json.loads(api_key_file)
api_key_description = {}
for data in api_key_data:
api_key_description[data['apiKey']] = data['description']
Это хорошо сработало для моей ситуации. Возможно, лучшие способы сделать это объяснены в комментариях ниже.
Другим вариантом будет использование функции literal_eval
из модуля ast
после внесения необходимых изменений, чтобы он соответствовал формату допустимого типа:
from ast import literal_eval
inJson = '''{
"key" : "A"
"description" : "1"
"uninterestingInformation" : "whatever"
}
{
"key" : "B"
"description" : "2"
"uninterestingInformation" : "whatever"
}
{
"key" : "C"
"description" : "3"
"uninterestingInformation" : "whatever"
}'''
inJson = "[" + inJson.replace("}", "},")[:-1] + "]"
inJson = inJson.replace("\"\n ","\",")
newObject = literal_eval(inJson)
print(newObject)
Выход:
[{'key': 'A', 'description': '1', 'uninterestingInformation': 'whatever'}, {'key': 'B', 'description': '2', 'uninterestingInformation': 'whatever'}, {'key': 'C', 'description': '3', 'uninterestingInformation': 'whatever'}]
Вы можете использовать re.split
для разделения содержимого файла на соответствующие строки JSON для синтаксического анализа:
import re
import json
j='''{
"key" : "A",
"description" : "1",
"uninterestingInformation" : "whatever"
}
{
"key" : "B",
"description" : "2",
"uninterestingInformation" : "whatever"
}
{
"key" : "C",
"description" : "3",
"uninterestingInformation" : "whatever"
}'''
print(list(map(json.loads, re.split(r'(?<=})\n(?={)', j))))
Эти результаты:
[{'key': 'A', 'description': '1', 'uninterestingInformation': 'whatever'}, {'key': 'B', 'description': '2', 'uninterestingInformation': 'whatever'}, {'key': 'C', 'description': '3', 'uninterestingInformation': 'whatever'}]