首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在没有外部递归函数的情况下解析多个嵌套的JSON键?

如何在没有外部递归函数的情况下解析多个嵌套的JSON键?
EN

Stack Overflow用户
提问于 2020-08-19 18:57:00
回答 1查看 80关注 0票数 0

我正在开发一个不一致的机器人,它解析API,格式化并返回数据。我需要解析嵌套键,特别是"current“、"today”、"day30“、"day90”和"day180“键,但找不到直接的方法。以下是JSON数据:

代码语言:javascript
复制
{
  "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%"
    }
  }
}

这将按预期方式工作:

代码语言:javascript
复制
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

和输出:

代码语言:javascript
复制
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%'}

我知道我需要这样做:

代码语言:javascript
复制
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

我希望它能简单地返回

代码语言:javascript
复制
negative
代码语言:javascript
复制
neutral

代码语言:javascript
复制
positive

它目前没有返回任何东西,因为我显然没有正确解析。我已经尝试了上面的许多不同的变体,但都没有效果。过去几个小时的谷歌搜索和尝试/错误让我在这里寻求建议。任何和所有的意见,欢迎和感谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-19 19:03:52

就像这样

代码语言:javascript
复制
 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)

输出

代码语言:javascript
复制
[['neutral', 1210.0], ['negative', -4.0], ['negative', -16.0]]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63485464

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档