Python 检查JSON变量是否具有可为空的密钥(Twitter流式API)

Python 检查JSON变量是否具有可为空的密钥(Twitter流式API),python,json,twitter,key,tweepy,Python,Json,Twitter,Key,Tweepy,我正在使用Tweepy从Twitter流媒体API下载推文。我设法检查下载的数据是否有“extended_tweet”这样的密钥,但我在另一个密钥中挣扎着使用一个特定的密钥 def on_data(self, data): savingTweet = {} if not "retweeted_status" in data: dataJson = json.loads(data) if 'extended_tweet' i

我正在使用Tweepy从Twitter流媒体API下载推文。我设法检查下载的数据是否有“extended_tweet”这样的密钥,但我在另一个密钥中挣扎着使用一个特定的密钥

def on_data(self, data):
    savingTweet = {}
        if not "retweeted_status" in data: 
            dataJson = json.loads(data)
            if 'extended_tweet' in dataJson:
                savingTweet['text'] = dataJson['extended_tweet']['full_text']
            else:
                savingTweet['text'] = dataJson['text']
            if 'coordinates' in dataJson:
                if 'coordinates' in dataJson['coordinates']:
                    savingTweet['coordinates'] = dataJson['coordinates']['coordinates']
            else:
                savingTweet['coordinates'] = 'null'
我正在属性地检查“extended_key”,但当我尝试对['coordinates]['coordinates]执行相同操作时,我得到以下错误:

TypeError: argument of type 'NoneType' is not iterable
Twitter文档称,关键“坐标”具有以下结构:

"coordinates":
{
    "coordinates":
    [
        -75.14310264,
        40.05701649
    ],
    "type":"Point"
}

我通过尝试使用冲突检查来解决它,除了,但我认为这不是解决问题的最合适的方法。还有其他想法吗?

所以推特API文档可能在返回的内容上撒了一点谎(震惊恐怖!),看起来您得到的是一个
,而不是预期的数据结构。您已经决定不使用try,catch,所以我不会再讨论这个问题,但是这里有一些其他的建议

使用dict get()默认值

我有两个选择,第一个是使用dict get命令的默认功能。如果预期的键不存在,则可以提供回退,这允许您将多个调用链接在一起

例如,您可以通过以下方法实现大部分目标:

return {
    'text': data.get('extended_tweet', {}).get('full_text', data['text']),
    'coordinates': data.get('coordinates', {}).get('coordinates', 'null')
}
它不是超级漂亮,但确实管用。这可能会比你现在做的慢一点

使用JSONPath

在这种情况下,另一种可能是过分的选择是使用一个库,它允许您在数据结构中搜索与查询匹配的项。比如:

from jsonpath_rw import parse

matches = parse('extended_tweet.full_text').find(data)
if matches:
    print(matches[0].value)
这将比你正在做的要慢得多,而且对于一些字段来说是多余的,但是如果你正在做大量这类工作,它可能是一个现成的工具。JSONPath还可以表示更复杂的路径,或者非常深的嵌套路径,在这些路径中,get方法可能无法工作,或者不适合

首先解析JSON

我要提到的最后一件事是确保在测试
“retweeted\u status”
之前解析JSON。如果文本出现在任何地方(比如在tweet文本中),将触发此测试

使用有能力的库进行JSON解析通常也非常快,因此除非您遇到真正的速度问题,否则不一定值得担心