如何解决如何在没有外部递归函数的情况下解析多个嵌套的JSON键?
我正在研究Discord Bot,它可以解析API,格式化并返回数据。 我需要解析嵌套的键,尤其是“当前”,“今天”,“ day30”,“ day90”和“ day180”键,并且找不到直接的方法。 这是JSON数据:
{
"item": {
"icon": "url_removed_for_obscurity","icon_large": "url_removed_for_obscurity","id": 859,"type": "Default","typeIcon": "url_removed_for_obscurity","name": "Example Item","description": "Example Item Description","current": {
"trend": "neutral","price": "1,210"
},"today": {
"trend": "negative","price": "- 16"
},"members": "true","day30": {
"trend": "negative","change": "-4.0%"
},"day90": {
"trend": "negative","change": "-8.0%"
},"day180": {
"trend": "negative","change": "-3.0%"
}
}
}
这可以按预期工作:
item_desc = '';
current_vals = ''; todays_vals = ''; day30_vals = ''; day90_vals = ''; day180_vals = ''
current_trend = ''; todays_trend = ''; day30_trend = ''; day90_trend = ''; day180_trend = '';
get_item_data = requests.get(item_endpoint).json()
for key,val in get_item_data.items():
if(query_id == str(val['id'])):
#print('[Debug] Found Item Through API...')
if('description' in val):
item_desc = str(val['description'])
await context.send(item_desc)
if('current' in val):
current_vals = str(val['current'])
await context.send(current_vals)
if('today' in val):
todays_vals = str(val['today'])
await context.send(todays_vals)
if('day30' in val):
day30_vals = str(val['day30'])
await context.send(day30_vals)
if('day90' in val):
day90_vals = str(val['day90'])
await context.send(day90_vals)
if('day180' in val):
day180_vals = str(val['day180'])
await context.send(day180_vals)
break
输出:
Example Item Description
{'trend': 'neutral','price': '1,210'}
{'trend': 'negative','price': '- 16'}
{'trend': 'negative','change': '-4.0%'}
{'trend': 'negative','change': '-8.0%'}
{'trend': 'negative','change': '-3.0%'}
我知道我需要做类似的事情:
current_trend = ''; todays_trend = ''; day30_trend = ''; day90_trend = ''; day180_trend = '';
if('current' in val):
current_vals = str(val['current'])
parse_current_vals = json.loads(current_vals)
if('trend' in parse_current_vals.items()):
current_trend = str(parse_current_vals['trend'])
await context.send(current_trend)
etc
我希望它简单地返回
negative
neutral
或
positive
它目前不返回任何内容,因为我显然没有正确解析。 我尝试了上述方法的许多不同变体,但均无济于事。最近几个小时的谷歌搜索和审判/错误使我在这里寻求建议。任何和所有输入都是值得欢迎和赞赏的。
解决方法
类似
data = {
"item": {
"icon": "url_removed_for_obscurity","icon_large": "url_removed_for_obscurity","id": 859,"type": "Default","typeIcon": "url_removed_for_obscurity","name": "Example Item","description": "Example Item Description","current": {
"trend": "neutral","price": "1210"
},"today": {
"trend": "negative","price": "-16"
},"members": "true","day30": {
"trend": "negative","change": "-4.0%"
},"day90": {
"trend": "negative","change": "-8.0%"
},"day180": {
"trend": "negative","change": "-3.0%"
}
}
}
def as_float(val):
value = val.strip()
if value.endswith('%'):
value = value[:-1]
value = value.replace(',','')
return float(value)
collected_trends = []
interesting_keys = {'day30','today','current'}
for key in interesting_keys:
entry = data['item'][key]
num = entry['change'] if 'change' in entry else entry['price']
collected_trends.append([entry['trend'],as_float(num)])
print(collected_trends)
输出
[['neutral',1210.0],['negative',-4.0],-16.0]]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。