【问题标题】:Reformatting a JSON API Response From Ethermine.org重新格式化来自 Ethermine.org 的 JSON API 响应
【发布时间】:2021-03-01 18:02:40
【问题描述】:

我正在编写一个调用 ethermine.org API 的 python 脚本,然后我使用 telegraf 将数据输入到 influxdb 并显示在 grafana 上。 Influxdb 和 telegraf 接受 json 格式和我工作的前两个 API pull,它们以以下格式显示数据(我用 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 这样的标签和一个它有一个标签说价格的值:然后 {两个标签} 几乎就像价格类别中的标签列表,我认为这可能是额外的“}”的来源。

{"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 修复它时我没有成功,因为我可能以错误的方式处理它。我将上传我在电报中遇到的错误的屏幕截图,然后还会上传我尝试修复它时遇到的 python 错误的屏幕截图。还可以在下面找到我的 python 脚本代码

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

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

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 调用返回的格式与前两个不同,我想将第三个重新格式化为与前两个相同的格式,或者只提取以美元为单位的价格(价格: "USD" 部分)格式(类似于说 {"time": xxx}),因为这是我想要使用的唯一部分。

【问题讨论】:

    标签: python json api python-requests


    【解决方案1】:

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

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

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

    requests.get() 的调用返回一个Response object,它实现了一个json() method,它将为您正确解析数据并将其作为Pyton dict 返回,其中所有嵌套的JSON 对象都可作为@987654336 中的键访问@。

    换句话说,而不是

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

    你想做的是

    statsPool.json()['data']
    

    这会返回一个 Python dict,您现在可以像这样得到价格:

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

    【讨论】:

    • 谢谢你说得通,但是我仍然对一件事感到困惑:为了测试,我用print(statsAltus.json()['data'])替换了我的工作print(json.dumps(json.loads(statsAltus.text)['data']))它在python本身中运行良好,它现在输出{'time': xxx, 'lastSeen': xxx, 'reportedHashrate': xxx, 'currentHashrate': xxx, 'validShares': xx, 'invalidShares': x, 'staleShares': x, 'averageHashrate': xxx, 'activeWorkers': x, 'unpaid': xxx, 'unconfirmed': None, 'coinsPerMin': xxx, 'usdPerMin': xxx, 'btcPerMin': xxx} Running字符不足,继续下一条评论
    • 但是,在 telegraf 中运行它时,我收到如下错误:gyazo.com/7bc6b8d0ed6aa4f6530a2092ad34fdcd 2021-03-01T10:29:08Z I! Starting Telegraf 1.17.3 2021-03-01T10:29:08Z E! [inputs.exec] Error in plugin: invalid character '\'' lo oking for beginning of object key string 不知道为什么,我看不到任何“\”字符...我会将其发布到如果它不适用于堆栈溢出,请访问 telegraf 论坛,但也许您也可以在这里提供帮助
    • 不看代码就很难判断,但我猜你输入数据的 API 需要不同的数据类型。具体来说,这可能意味着 API 期望数据为 Python dict,但您传入的是包含 JSON 或类似内容的字符串。
    • 请记住,Python dicts 和 JSON 对象表示为字符串,尽管它们看起来非常相似,但它们是不同的东西。
    • 您需要查看哪些代码才能获得更好的图片?我可以链接 telegraf 的文档 (docs.influxdata.com/telegraf/v1.17/data_formats/input/json),但我认为如果我在他们的论坛上提问可能会更好
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-29
    • 2023-03-16
    • 2012-11-06
    • 2016-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多