Разобрать файл с объектами JSON в Python

1

У меня есть файл с таким типом структуры:

{ 
  "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']

Это хорошо сработало для моей ситуации. Возможно, лучшие способы сделать это объяснены в комментариях ниже.

Теги:

2 ответа

1

Другим вариантом будет использование функции 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'}]
  • 0
    наконец, я сделал нечто подобное. Я заменил '} / n {' на '}, / n {'.
-2

Вы можете использовать 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'}]
  • 0
    Вы запятые хотя. Это не те данные, которые есть у OP, а их разделители.
  • 0
    Я основываю свои предположения на утверждении ОП: «Этот файл не совсем файл .json, это файл с большим количеством похожих объектов json.», Что означает, что файл имеет несколько допустимых объектов JSON и отсутствие запятые в его примере только из-за его быстрого набора только для иллюстрации.
Показать ещё 6 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню