从Ethermine.org重新格式化JSON API响应

2024-04-26 21:08:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一个调用ethermine.org API的python脚本,然后我使用telegraf将数据输入influxdb,并在grafana上显示。 Influxdb和telegraf接受json格式和我所做的前两个API拉取,它们以以下格式显示数据(我用x代替返回的实际值):

{"time": xxx, "lastSeen": xxx, "reportedHashrate": xxx, "currentHashrate": xxx, "validShares": x, "invalidShares": 0, "staleShares": 0, "averageHashrate": x, "activeWorkers": x, "unpaid": xx, "unconfirmed": null, "coinsPerMin": xxxx, "usdPerMin": xxxx, "btcPerMin": xxxx}

然而,我尝试执行的第三次拉动似乎是输出一个额外的“}”字符,并且似乎格式略有不同(而不是像currentHashrate这样的标记,它有一个标记,比如price:then{两个以上的标记}因此,几乎就像价格类别中的标签列表一样,我认为额外的“}”可能来自于此

{"topMiners": [], "minedBlocks": [{"number": x, "miner": "x", "time": x}, {"number": x, "miner": "x", "time": x}, {"number": x, "miner": "x", "time": x}, {"number": x, "miner": "x", "time": x}, {"number": x, "miner": "x", "time": x}, {"number": x, "miner": "x", "time": x}, {"number": x, "miner": "x", "time": x}, {"number": x, "miner": "x", "time": x}, {"number": x, "miner": "x", "time": x}, {"number": x, "miner": "x", "time": x}], "poolStats": {"hashRate": x, "miners": x, "workers": x, "blocksPerHour": x}, "price": {"usd": xxx, "btc": xxx}}

请注意,我是python新手,所以在我尝试使用google修复它的过程中,我没有成功,因为我可能用了错误的方法。我将上传我在telegraf中遇到的错误的屏幕截图,然后是我尝试修复它时遇到的python错误的屏幕截图。也可以在下面找到我的python脚本代码

enter image description here

我认为与这些代码行相关的python错误

print(statsPool.text)
poolS=json.loads(statsPool.text)
print(f'{poolS["price"]}')

enter image description here

import json
import requests

# Miner - Statistics Armand
keyArmand = 'xxxxxxxxxx'
urlArmand = 'https://api.ethermine.org/miner/' + keyArmand + '/currentStats'


# Miner - Statistics Altus
keyAltus = 'xxxxxxxxxxx'
urlAltus = 'https://api.ethermine.org/miner/' + keyAltus + '/currentStats'

# PoolStats
urlPoolStats = 'https://api.ethermine.org' + '/poolStats'

#call 1
statsArmand = requests.get(urlArmand)
#call 2
statsAltus = requests.get(urlAltus)
#call 3
statsPool = requests.get(urlPoolStats)

print(json.dumps(json.loads(statsArmand.text)['data']))
print(json.dumps(json.loads(statsAltus.text)['data']))

#problem line (prints an extra '}' at the end
print(json.dumps(json.loads(statsPool.text)['data']))

#next 3 lines is what I tried to do to fix it (either need to get rid of the extra '}' at the end or I just need the price tag displayed in the correct format
print(statsPool.text)
poolS=json.loads(statsPool.text)
print(f'{poolS["price"]}')

作为总结:第三个python json API调用将返回一个不同的格式给前两个,我想将第三个重新格式化为与前两个相同的格式,或者只提取格式(类似于{“time”:xxx})中以美元表示的价格(价格:“USD”部分),因为这是我想要使用的唯一部分


Tags: thetextorgjsonnumbertime格式错误
1条回答
网友
1楼 · 发布于 2024-04-26 21:08:31

在以JSON格式返回数据的API上使用requests.get()时,您可能希望requests为您处理数据,而不是将其作为文本访问并手动解析

由于返回的JSON对象包含嵌套的JSON对象,因此当您将其作为文本获取时,必须手动解析每个嵌套对象(例如,使用json.loads()

在对requests.get(urlPoolStats)的调用中,返回的JSON对象包含另一个JSON对象,在调用json.loads(statsPool.text)时,该对象不会被解析,这很可能是您尝试访问price时失败的原因

^{}的调用返回一个^{} object,该^{} object实现一个^{} method,该^{} method将为您正确解析数据,并将其作为Pyton dict返回,所有嵌套的JSON对象都可以作为dict中的键访问

换句话说,不是

json.dumps(json.loads(statsPool.text)['data'])

你想做的是

statsPool.json()['data']

这将返回一个Python dict,您现在可以得到如下价格:

statsPool.json()['data']['price']

相关问题 更多 >