我有一个简单的python 3.6程序,该程序使用Boto3库下载AWS S3 JSON文件
import boto3
import json
s3 = boto3.resource('s3')
content_object = s3.Object('my-bucket-name', 'folder1/folder2/emr-config.json')
file_content = content_object.get()['Body'].read().decode('utf-8')
json_content = json.loads(file_content)
print(json_content)
但是该程序会将JSON文件中使用的双引号更改为'单引号,即,当我直接从AWS管理控制台下载文件时,JSON使用双引号,但是当我运行程序并打印出结果JSON,它使用'单引号。
[{'Properties': {'maximizeResourceAllocation': 'true'}, 'Classification': 'spark'}]
相对
[{"Properties": {"maximizeResourceAllocation": "true"}, "Classification": "spark"}]
这是我将用于创建EMR群集的配置文件,并且只有在JSON配置使用“双引号”时,该文件才有效。
我想找到一个不涉及我对整个文件进行查找和替换的解决方案。我可以用“双引号”形式下载文件吗?
答案 0 :(得分:2)
源自:json.loads does not keep double quotes intact
首先:引号不是值的一部分。它们是语法的一部分,向解析器表明已定义了字符串。
JSON仅支持双引号,但在 Python 中,可以使用单引号或双引号定义字符串。当回显字符串值时,Python通过显示Python语法以重新定义相同的值来反映该值。对于此表示形式,单引号是首选。仅当该值实际包含至少一个单引号并且不包含双引号时,才会使用双引号:
>>> "Normal strings are reflected with single quotes by Python"
'Normal strings are reflected with single quotes by Python'
>>> 'Single quote: \''
"Single quote: '"
>>> 'Single quote: \', and a double quote: \"'
'Single quote: \', and a double quote: "'
您看到的是完全正常的行为。您无法更改此设置;您看到的输出是调试工具。如果需要更改,请制作自己的格式化程序。
当您再次从Python结构中生成JSON时,将仅使用双引号来生成有效的JSON输出:
>>> import json
>>> json_string = '{"created_at": "2012/02/05 04:03:50 -0800"}'
>>> json.loads(json_string)
{u'created_at': u'2012/02/05 04:03:50 -0800'}
>>> json.dumps(json.loads(json_string))
'{"created_at": "2012/02/05 04:03:50 -0800"}'
答案 1 :(得分:2)
如果您只是想通过Python获取JSON字符串,为什么还要麻烦将其反序列化为对象呢?您可以按原样编写file_contents,它将保留为有效的JSON