我一直致力于一个侧面项目,我一直在努力使用Python从JSON响应中提取数据。无论我想出什么,我似乎都没有一个正确格式化的JSON结果(可能因为我是Python的新手,所以我可以使用一些指导)
使用这几行我查询API并将响应写入文件:
response = client.get_products()
with open('file.json', 'w') as f:
f.write(str(response))
生成的json文件如下所示:
{
'version': 'value',
'list': [
'{
"product":
{
"attributes":
{
"name":"value",
"location":"value"
},
"description":"text productA"
},
"version":"value"
}',
'{
"product":
{
"attributes":
{
"name":"value",
"location":"value"
},
"description":"text productB"
},
"version":"value"
}'
],
'date':'value'
}
这看起来不像有效的JSON,请注意单引号...但是,{"product":...}
内的所有内容看起来都很好。所以我尝试了另一种方法:
response = client.get_products()
with open('file.json', 'w') as output:
json.dump(response, output)
这次json文件包含以下内容:
{
"version": "value",
"list": [
"{
\"product\":
{
\"attributes\":
{
\"name\":\"value\",
\"location\":\"value\"
},
\"description\":\"text productA\"
},
\"version\":\"value\"
}",
"{
\"product\":
{
\"attributes\":
{
\"instanceType\":\"value\",
\"location\":\"value\"
},
\"description\":\"text productB\"
},
\"version\":\"value\"
}"
],
"date": "value"
}
嗯,不是我想到的......
问题:我做错了什么?更重要的是,如何将响应写入有效的格式化JSON文件?所以预期的结果应该是:
{
"version": "value",
"list": [
{
"product":
{
"attributes":
{
"name":"value",
"location":"value"
},
"description":"text productA"
},
"version":"value"
},
{
"product":
{
"attributes":
{
"name":"value",
"location":"value"
},
"description":"text productB"
},
"version":"value"
}
],
"date": "value"
}
最后我将在响应中隔离所有“产品”条目,奖励积分以获得有关如何实现此目的的其他提示:)
答案 0 :(得分:2)
该对象包含带有JSON编码的字符串。 list
键引用的列表中的每个元素都是一个字符串对象,恰好包含有效的JSON数据。通过使用json.dumps()
,您将这些字符串编码为JSON值,因此使用反斜杠完全正确;它是不透明的数据,否则,JSON编码器对数据本身也是有效的JSON无关紧要。
这些元素是JSON字符串可能是您所调用服务一侧的错误。您现在需要首先通过解码这些JSON字符串来撤消该错误:
response = client.get_products()
response['list'] = [json.loads(s) for s in response['list']]
with open('file.json', 'w') as output:
json.dump(response, output)
如果您还负责API输出,请修复该输出。不要对数据进行双重编码。
正如您所发现的,使用str()
不会产生JSON输出。这使用有效的Python语法生成 Python表示。