检查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)的主要内容,如果未能解决你的问题,请参考以下文章