分别获取json文件的项目

时间:2019-04-10 10:40:02

标签: python json file

伙计们,所以我正在尝试读取Json文件并将其特定内容写在列表中。但是json文件用单引号引起来,所以我得到了错误。

simplejson.errors.JSONDecodeError:期望属性名称用双引号引起来:第1行第2列(字符1)

我试图将json文件从单引号转换为双引号,但它不起作用(我也看到了与此有关的其他stackoverflow问题,但对我不起作用)。因为我用str.replace尝试过。或json转储等。而且总是有不同的问题。我的代码是这样的:

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文件并将其特定项写入文件或列表等...

编辑: 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响应,但是用单引号而不是双引号...

所需的输出是将所有json文件的'message'项目放入另一个文件中,例如:

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 个答案:

答案 0 :(得分:2)

问题是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']