检查JSON var是否具有可为空的密钥(Twitter Streaming API)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了检查JSON var是否具有可为空的密钥(Twitter Streaming API)相关的知识,希望对你有一定的参考价值。

我正在使用Tweepy从Twitter Streaming 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'属性,但是当我尝试用['坐标] ['坐标]做同样的事情时,我得到以下错误:

TypeError: argument of type 'NoneType' is not iterable

Twitter文档说关键'坐标'具有以下结构:

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

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

答案

因此,推特API文档可能会对它们返回的内容有所了解(震惊恐怖!),看起来你正在获得一个None来取代预期的数据结构。你已经决定不使用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

另一种选择,对于这种情况可能有点过分,就是使用JSONPath库,它允许您在数据结构中搜索与查询匹配的项目。就像是:

from jsonpath_rw import parse

matches = parse('extended_tweet.full_text').find(data)
if matches:
    print(matches[0].value)

这比你正在做的要慢得多,而且对于一些领域来说太过分了,但是如果你做了很多这样的工作,它可能是一个方便的工具。 JSONPath还可以表达更复杂的路径,或者非常深层次的嵌套路径,其中get方法可能不起作用,或者是unweildy。

首先解析JSON!

我要提到的最后一件事是确保在对"retweeted_status"进行测试之前解析JSON。如果文本出现在任何地方(例如在推文的文本内),则会触发此测试。

使用一个称职的库进行JSON解析通常也非常快,所以除非你遇到真正的速度问题,否则不一定值得担心。

以上是关于检查JSON var是否具有可为空的密钥(Twitter Streaming API)的主要内容,如果未能解决你的问题,请参考以下文章

可为空的对象必须具有一个值 是啥原因啊 求解 谢谢

可为空的对象必须具有一个值

从类中获取可为空的 var

铲斗分类分析(我检查铲斗是否为空的次数)

如何使用 System.Text.Json 处理可为空的引用类型?

在 JSON 文件中保存和加载可为空的字符串