伙计们,所以我正在尝试读取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
....
错误:
答案 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']