使用JSONLint验证AWS Boto3返回的JSON响应时出现解析错误
问题解答
首先明确说:AWS返回的是完全符合规范的JSON,你遇到的问题不是AWS的锅,而是你看到的内容并不是原始的JSON响应——那是Boto3把JSON解析成Python字典后的字符串表示。
为什么会出现u'xxx'这种格式?
在Python 2中,u'字符串'是Unicode字符串的标识。Boto3的客户端方法(比如describe_instance_status)会自动把AWS返回的JSON响应解析成Python的数据结构(字典、列表等),当你直接print(status)时,输出的是这个Python字典的repr()结果,它带有的u前缀是Python自己的语法,并不是JSON的一部分。
如何获取能被JSONLint验证的标准JSON?
如果你想验证AWS返回的JSON格式,需要把Python字典重新转换成标准的JSON字符串,用json.dumps()方法修改你的代码:
import boto3 import json ec2 = boto3.resource('ec2') for status in ec2.meta.client.describe_instance_status()['InstanceStatuses']: # 把Python字典转成标准JSON字符串 print(json.dumps(status))
这样输出的内容就没有u前缀了,完全符合JSON规范,粘贴到JSONLint就能正常通过验证。
额外说明
其实你完全没必要手动验证JSON——Boto3已经帮你完成了解析工作,直接用返回的Python字典进行业务逻辑处理就好,这也是SDK的优势之一。如果真的需要获取原始的HTTP响应内容,可以借助botocore的低层接口,但绝大多数场景下都不需要这么做。
内容的提问来源于stack exchange,提问作者BioRod
相关产品推荐
相关产品推荐

