【发布时间】:2018-02-05 18:47:47
【问题描述】:
我有一个实施问题...
#!/usr/bin/python
#This is the API for BTC price request.
# Average all the amounts, and push that to the program
import json
import urllib.request
from jsonpath_rw import parse as parse_jsonpath
class BtcAPI:
def __init__(self, url, api_id, json_key):
self.url = url
self.api_id = api_id
self.json_key = json_key
def btc_api_call(self):
hdr = { 'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1; Win64; x64)' }
req = urllib.request.Request(self.url, headers=hdr)
readdata = urllib.request.urlopen(req)
json_data = readdata.read()
json_dict = json.loads(json_data)
results = parse_jsonpath(self.json_key).find(json_dict)
print(results)
class Price:
def __init__(self, api_id, url, json_key):
self.api_id = api_id
self.url = url
self.json_key = json_key
def pass_for_request(self):
get_price = BtcAPI(self.url, self.api_id, self.json_key)
get_price.btc_api_call()
def Coindesk():
coindesk = Price("coindesk","https://api.coindesk.com/v1/bpi/currentprice.json","time.updated")
coindesk.pass_for_request()
为“json_key”传递的值是“bpi.USD.rate_float”...在这个 url 中。它被传递给一个名为“Price”的类,该类创建传递给包含上述代码的类的变量。
coindesk = Price("coindesk","api.coindesk.com/v1/bpi/currentprice.json", "bpi.USD.rate_float")
这是我所针对的 json...试图获取 rate_float 键:
{
"time": {
"updated": "Feb 5, 2018 18:34:00 UTC",
"updatedISO": "2018-02-05T18:34:00+00:00",
"updateduk": "Feb 5, 2018 at 18:34 GMT"
},
"disclaimer": "This data was produced from the CoinDesk Bitcoin Price Index (USD). Non-USD currency data converted using hourly conversion rate from openexchangerates.org",
"chartName": "Bitcoin",
"bpi": {
"USD": {
"code": "USD",
"symbol": "$",
"rate": "7,004.9588",
"description": "United States Dollar",
"rate_float": 7004.9588
}
}
当我运行程序时,它使用“bpi.USD.rate_float”向我发送整个 json 文件的输出,而不是我试图通过 jsonpath 定位的特定键 我正在使用 jsonpath_rw。
如何使用 jsonpath 有效地定位 rate_float 键?
【问题讨论】:
-
parse_jsonpath在jsonpath_rw中不存在。它有什么作用?time.updated与您的其余问题有什么关系? “在这个网址内”?什么网址?如果我们看不到该类的任何代码,您认为Price行将如何帮助我们?它甚至相关吗?与其向我们提供您认为相关的随机代码片段,不如给我们一个最小的、完整的、可重现问题的工作示例:stackoverflow.com/help/mcve。您可能误解了某些东西的工作原理,或者我们看不到的代码部分存在错误。 -
对不起。 time.updated 是一个错字。我用它来测试我是否可以针对另一个键。它应该是 bpi.USD.rate_float。
-
已更新以包含所有代码。我认为没有必要包含整个代码主体,因为我怀疑问题是语法错误……无需大量测试就可以相对容易地解决。
-
请注意我提到的“最小”。您无需向我们展示您的所有代码。在演示问题的同时,您可以删除多少代码?例如。如果将所有代码替换为
from jsonpath_rw import parse as parse_jsonpath; results = parse_jsonpath("bpi.USD.rate_float").find({your_actual_dict_goes_here}); print(results)(用换行符而不是;)会发生什么?你还有同样的问题吗? -
我在这里要做的唯一一件事就是帮助您找出问题所在。如果我建议的最小代码确实按您的预期工作,那么您的问题不在于
jsonpath,而在于某处else。例如。您确定您发出的 HTTP 请求实际上返回了您期望的数据吗?