Python、jsonpath:如何正确解析 jsonpath?
Python, jsonpath: How do I parse with jsonpath correctly?
我有一个实施问题...
#!/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" 的 class,它创建传递给包含上述代码的 class 的变量。
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
}
}
当我 运行 程序时,它向我发送整个 json 文件的输出,而不是我试图通过 json 路径定位的特定键,使用 "bpi.USD.rate_float"
我正在使用 jsonpath_rw.
如何使用 jsonpath 有效地定位 rate_float 键?
问题是您可能认为 results
包含来自 Python dict
.
的纯字符串值
那实际上不是 jsonpath_rw
return 的东西。如果您查看 https://github.com/kennknowles/python-jsonpath-rw 中的示例,您会发现它确实如此,例如
[match.value for match in jsonpath_expr.find({'foo': [{'baz': 1}, {'baz': 2}]})]
正如它进一步提到的那样:
The result of JsonPath.find provide detailed context and path data so it is easy to traverse to parent objects, print full paths to pieces of data, and generate automatic ids.
find
实际上 return 是一个包含上下文信息的对象列表。如果您想要的只是字符串值,并且您只希望为您的 JSONPath 表达式获得一个 return 值,那么您需要执行如下操作:
results = parse_jsonpath(self.json_key).find(json_dict)
print(results[0].value)
这里是一个有效的 Python 3 方法:
def json_by_jsonpath():
v_json = "{\"_id\":{\"oid\":\"55561331552632234577\"},\"profilePatId\":\"123456\",\"patientPatId\":\"123456\",\"comboOrder\":false,\"globalOrderCode\":{\"$numberInt\":\"1\"},\"orderRefNum\":\"621980991862\",\"functionality\":{\"$numberInt\":\"38\"},\"rxType\":{\"$numberInt\":\"1\"},\"orderStoreNum\":\"59382\",\"orderChannel\":\"RR_EM\",\"orderChannelDtls\":\"QULL\",\"scriptDetailRetail\":[{\"rxNum\":{\"$numberInt\":\"274879\"},\"rxStoreNum\":{\"$numberInt\":\"59382\"},\"autoRefillEnabled\":false,\"autoRefillEligible\":false,\"insuranceAvailable\":false,\"sddDrugEligible\":false,\"drugQty\":{\"$numberInt\":\"0\"},\"deliveryInd\":\"1\",\"deliveryComments\":\"Ring bell and drop of in box. This comment is for SDD notes\",\"additionalComments\":\"Please call my insurance and this comment is on notes section\",\"appCode\":{\"$numberInt\":\"291\"}},{\"rxNum\":{\"$numberInt\":\"447902\"},\"rxStoreNum\":{\"$numberInt\":\"59382\"},\"autoRefillEnabled\":false,\"autoRefillEligible\":false,\"insuranceAvailable\":false,\"sddDrugEligible\":false,\"drugQty\":{\"$numberInt\":\"0\"},\"deliveryInd\":\"1\",\"deliveryComments\":\"Ring bell and drop of in box. This comment is for SDD notes\",\"additionalComments\":\"Please call my insurance and this comment is on notes section\",\"appCode\":{\"$numberInt\":\"100\"}}],\"_class\":\"com.rx.repositories.xOrderRetail\"}"
v_jsonpath = '$._id.oid' #'$.patientPatId'
myjson = json.loads(v_json)
#print(myjson)
#result_list = [match.value for match in v_jsonpath.find(v_json)]
#print(result_list)
json_tag_val = parse(v_jsonpath).find(myjson)
print(json_tag_val)
return json_tag_val[0].value
我有一个实施问题...
#!/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" 的 class,它创建传递给包含上述代码的 class 的变量。
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
}
}
当我 运行 程序时,它向我发送整个 json 文件的输出,而不是我试图通过 json 路径定位的特定键,使用 "bpi.USD.rate_float" 我正在使用 jsonpath_rw.
如何使用 jsonpath 有效地定位 rate_float 键?
问题是您可能认为 results
包含来自 Python dict
.
那实际上不是 jsonpath_rw
return 的东西。如果您查看 https://github.com/kennknowles/python-jsonpath-rw 中的示例,您会发现它确实如此,例如
[match.value for match in jsonpath_expr.find({'foo': [{'baz': 1}, {'baz': 2}]})]
正如它进一步提到的那样:
The result of JsonPath.find provide detailed context and path data so it is easy to traverse to parent objects, print full paths to pieces of data, and generate automatic ids.
find
实际上 return 是一个包含上下文信息的对象列表。如果您想要的只是字符串值,并且您只希望为您的 JSONPath 表达式获得一个 return 值,那么您需要执行如下操作:
results = parse_jsonpath(self.json_key).find(json_dict)
print(results[0].value)
这里是一个有效的 Python 3 方法:
def json_by_jsonpath():
v_json = "{\"_id\":{\"oid\":\"55561331552632234577\"},\"profilePatId\":\"123456\",\"patientPatId\":\"123456\",\"comboOrder\":false,\"globalOrderCode\":{\"$numberInt\":\"1\"},\"orderRefNum\":\"621980991862\",\"functionality\":{\"$numberInt\":\"38\"},\"rxType\":{\"$numberInt\":\"1\"},\"orderStoreNum\":\"59382\",\"orderChannel\":\"RR_EM\",\"orderChannelDtls\":\"QULL\",\"scriptDetailRetail\":[{\"rxNum\":{\"$numberInt\":\"274879\"},\"rxStoreNum\":{\"$numberInt\":\"59382\"},\"autoRefillEnabled\":false,\"autoRefillEligible\":false,\"insuranceAvailable\":false,\"sddDrugEligible\":false,\"drugQty\":{\"$numberInt\":\"0\"},\"deliveryInd\":\"1\",\"deliveryComments\":\"Ring bell and drop of in box. This comment is for SDD notes\",\"additionalComments\":\"Please call my insurance and this comment is on notes section\",\"appCode\":{\"$numberInt\":\"291\"}},{\"rxNum\":{\"$numberInt\":\"447902\"},\"rxStoreNum\":{\"$numberInt\":\"59382\"},\"autoRefillEnabled\":false,\"autoRefillEligible\":false,\"insuranceAvailable\":false,\"sddDrugEligible\":false,\"drugQty\":{\"$numberInt\":\"0\"},\"deliveryInd\":\"1\",\"deliveryComments\":\"Ring bell and drop of in box. This comment is for SDD notes\",\"additionalComments\":\"Please call my insurance and this comment is on notes section\",\"appCode\":{\"$numberInt\":\"100\"}}],\"_class\":\"com.rx.repositories.xOrderRetail\"}"
v_jsonpath = '$._id.oid' #'$.patientPatId'
myjson = json.loads(v_json)
#print(myjson)
#result_list = [match.value for match in v_jsonpath.find(v_json)]
#print(result_list)
json_tag_val = parse(v_jsonpath).find(myjson)
print(json_tag_val)
return json_tag_val[0].value