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应该是字典吗?
答案 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)
您应该做一些小的改动:
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"]
如果您想确保只有一个结果,请执行if
语句检查。
if len(houseData) != 1:
raise ValueError("Expecting only 1 houseData.")
data = houseData[0]
...