如何将下载的JSON数据放入python中的变量中

时间:2016-06-20 19:38:30

标签: python json dictionary

import requests
import json
import csv

# These our are demo API keys, you can use them!
#location = ""
api_key = 'simplyrets'
api_secret = 'simplyrets'
#api_url = 'https://api.simplyrets.com/properties?q=%s&limit=1' % (location)
api_url = 'https://api.simplyrets.com/properties'

response = requests.get(api_url, auth=(api_key, api_secret))
response.raise_for_status()
houseData = json.loads(response.text)

#different parameters we need to know
p = houseData['property']
roof = p["roof"]
cooling = p["cooling"]
style = p["style"]
area = p["area"]
bathsFull = p["bathsFull"]
bathsHalf = p["bathsHalf"]

这是我正在使用的代码片段,用于尝试从API提供的JSON中获取信息,并将它们放入我实际可以使用的变量中。

我认为当你用json.loads()加载它时它会成为一本字典。

然而它告诉我,我不能p = houseData['property'],因为“list indices must be integers, not str”。

我错了,houseData应该是字典吗?

5 个答案:

答案 0 :(得分:1)

返回了数百个属性,所有属性都在列表中。

您需要指定所需的属性,因此对于第一个属性:

p = houseData[0]['property']

答案 1 :(得分:0)

来自https://docs.python.org/2/library/json.html

  

json.loads(s[, encoding[, cls[, object_hook[, parse_float[, parse_int[, parse_constant[, object_pairs_hook[, **kw]]]]]]]])

     

使用此转换表将s(包含JSON文档的str或unicode实例)反序列化为Python对象。

     

如果s是str实例并且使用UTF-8以外的基于ASCII的编码(例如latin-1)进行编码,则必须指定适当的编码名称。不允许使用非基于ASCII的编码(例如UCS-2),并且应首先将其解码为unicode。

     

其他参数与load()中的含义相同。

如果您的JSON在最外层作为数组启动,它将是一个数组。如果你的JSON的最外层是一个关联数组,那么请发布你的JSON,我们可以进一步研究它。

答案 2 :(得分:0)

问题在于json.loads()并不一定会返回字典。如果JSON的外部容器是列表,则json.loads()将返回一个列表,其中元素可以是列表或字典。尝试迭代json.loads()返回的列表。您正在寻找的词典可能只是json.loads()[0]或其他一些元素。

答案 3 :(得分:0)

有两种不同类型的JSON元素:节点和数组。

节点如下:

node = {
    foo = 7
    bar = "Hello World!"
}

数组如下所示:

array = [ "one", "two", 3, 4, "5ive" ]

您的JSON元素可能是一个数组。您可以使用以下命令验证它是数组,字典还是其他:

isinstance(json_element, dict)
isinstance(json_element, list)

希望这有帮助!

答案 4 :(得分:0)

您应该做一些小的改动:

  1. 您的API响应正在返回一个列表,因此您必须对其进行迭代。
  2. requests库已经支持转换为JSON,因此您不必担心它。

    import requests
    
    
    # These our are demo API keys, you can use them!
    #location = ""
    api_key = 'simplyrets'
    api_secret = 'simplyrets'
    #api_url = 'https://api.simplyrets.com/properties?q=%s&limit=1' % (location)
    api_url = 'https://api.simplyrets.com/properties'
    
    response = requests.get(api_url, auth=(api_key, api_secret))
    response.raise_for_status()
    houseData = response.json()
    
    # different parameters we need to know
    for data in houseData:
        p = data['property']
        roof = p["roof"]
        cooling = p["cooling"]
        style = p["style"]
        area = p["area"]
        bathsFull = p["bathsFull"]
        bathsHalf = p["bathsHalf"]
    
  3. 如果您想确保只有一个结果,请执行if语句检查。

    if len(houseData) != 1:
        raise ValueError("Expecting only 1 houseData.")
    
    data = houseData[0]
    ...