Возьмите элементы файла JSON отдельно - PullRequest
0 голосов
/ 10 апреля 2019

Привет, ребята, поэтому я пытаюсь прочитать файл Json и записать определенный элемент в список. Но файл json находится в одинарных кавычках, поэтому я получаю сообщение об ошибке.

simplejson.errors.JSONDecodeError: Ожидается имя свойства, заключенное в двойные кавычки: строка 1, столбец 2 (символ 1)

Я пытался преобразовать файл json из одинарных кавычек в двойные, но это не сработало (я также видел другие вопросы об стеке потока, но у меня это не сработало). Потому что я попробовал это с str.replace. или json dumps и т. д. И это всегда было другой проблемой. Мой код такой:

messages = []

with open("commitsJson.json","r", encoding="utf8") as json_file:
    data = json.load(json_file)

for p in data['items']:
       messages.append(p['message'])
       authors.write(p['message']+"\r\n")
       print(p['message'])

Таким образом, ожидаемый результат - прочитать файл json и записать его отдельные элементы в файл или список и т. Д. *

EDIT: Образец файла JSON:

{'total_count': 3, 'incomplete_results': False, 'items': [{'url': 'https://gits-20.bkf.sda.eu/api/v3/repos/repo/name/commits/2189312903jsadada', 
'sha': '2131932103812jdskfsl', 'node_id': 'asl;dkas;ldjasldasio1203', 
'html_url': 'https://gits-20.bkf.sda.eu/api/v3/repos/repo/name/commits/2189312903jsadada', 
'comments_url': 'https://gits-20.bkf.sda.eu/api/v3/repos/repo/name/commits/2189312903jsadada',
 'commit': {'url': 'https://gits-20.bkf.sda.eu/api/v3/repos/repo/name/commits/2189312903jsadada', 'message': 'Initial commit 1'

Нечто подобное. В основном ответ github api, но с одинарными кавычками вместо двойных ...

Желательным выводом будет получение элементов 'message' из всех файлов json в другой файл, например:

Initial commit 1
Initial commit 2
Initial commit 3
Initial commit 4
Initial commit 5
Initial commit 6
Initial commit 7
....

ОШИБКА:

enter image description here

1 Ответ

2 голосов
/ 10 апреля 2019

Проблема в том, что json ожидает двойные кавычки для окружения строк

Использование ast.literal_eval для содержимого файла:

commitJson.json :

{
  'total_count': 3, 'incomplete_results': False, 'items': [{'url': 'https://gits-20.bkf.sda.eu/api/v3/repos/repo/name/commits/2189312903jsadada',
  'sha': '2131932103812jdskfsl', 'node_id': 'asl;dkas;ldjasldasio1203',
  'html_url': 'https://gits-20.bkf.sda.eu/api/v3/repos/repo/name/commits/2189312903jsadada',
  'comments_url': 'https://gits-20.bkf.sda.eu/api/v3/repos/repo/name/commits/2189312903jsadada',
   'commit': {'url': 'https://gits-20.bkf.sda.eu/api/v3/repos/repo/name/commits/2189312903jsadada', 'message': 'Initial commit 1'}}]
}

Следовательно :

import ast
with open("commitJson.json","r", encoding="utf8") as json_file:
    data = ast.literal_eval(json_file.read())

for elem in data['items']:
    for e in elem['commit']:
       if 'message' in e:
           print(elem['commit'][e])

ВЫХОД :

Initial commit 1

Укороченная версия :

print([elem['commit'][e] for e in elem['commit'] if 'message' in e for elem in data['items']])

ВЫХОД :

['Initial commit 1']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...