使用Python格式化JSON响应

时间:2018-01-01 16:03:57

标签: python json

我一直致力于一个侧面项目,我一直在努力使用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"
}

最后我将在响应中隔离所有“产品”条目,奖励积分以获得有关如何实现此目的的其他提示:)

1 个答案:

答案 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表示