Python请求.json()对象作为字典,无法使用hasattr()或object.keys()调用中的值识别自己的键

Python请求.json()对象作为字典,无法使用hasattr()或object.keys()调用中的值识别自己的键,python,json,mongodb,dictionary,Python,Json,Mongodb,Dictionary,摘要:dictionary/json对象表示它没有给定的键(使用对象中的hasattr调用或值。键布尔测试,即使该键显示在object.keys()调用中。那么我如何访问该键的值 更长的版本:试图解析从API返回的一些json时,我感到非常困惑。当我试图确定显示为字典的json对象是否具有给定的键时,即使代码显示该对象的键在那里,代码也会为该键返回false 下面是我如何检索json的: r = requests.get(url, headers = {'User-Agent':UA})

摘要:dictionary/json对象表示它没有给定的键(使用对象中的
hasattr
调用或
值。键
布尔测试,即使该键显示在
object.keys()
调用中。那么我如何访问该键的值

更长的版本:试图解析从API返回的一些json时,我感到非常困惑。当我试图确定显示为字典的json对象是否具有给定的键时,即使代码显示该对象的键在那里,代码也会为该键返回false

下面是我如何检索json的:

   r = requests.get(url, headers = {'User-Agent':UA})

    try:
        print(r.json())
        jsonobject = r.json()
        print("class of jsonobject is %s"%jsonobject.__class__.__name__)
        print("here are dictionary keys %s"%jsonobject.keys())
        if hasattr(jsonobject, 'laps') and jsonobject['laps'] is not None:
            ...
        else:
            print("no laps object")

        if hasattr(jsonobject, 'points') and jsonobject['points'] is not None:
           ...
我这样做的原因是,我经常从嵌套在“laps”数组或“points”数组中的字段中得到编码错误,因此我无法将json数据插入MongoDB数据库。我想从json对象中删除这些字段,因为它们根本不包含有用的信息

问题是json对象总是为hasattr(jsonobject,'laps')和hasattr(jsonobject,'points')返回false。即使是在我打印出键并显示以下内容的记录中,它也返回false:

here are dictionary keys dict_keys(['is_peptalk_allowed', 'show_workout', 'hydration', 'records', 'include_in_stats', 'expand', 'pb_count', 'start_time', 'calories', 'altitude_max', 'hashtags', 'laps', 'pictures', 'duration', 'playlist'\
, 'sport', 'points', 'show_map', 'local_start_time', 'speed_avg', 'tagged_users', 'distance', 'altitude_min', 'is_live', 'author', 'feed_id', 'speed_max', 'id'])
因此,我认为dict在hasattr中的行为可能很奇怪,并将代码改写为:

if 'laps' in jsonobject.keys() and jsonobject['laps'] is not None:
但这也会返回false,即使UG hit再次打印包含“laps”的相同键数组。

hasattr()
是完全错误的工具。它测试属性,但字典键不是属性

要测试键,请直接对字典使用
测试中的

调用
jsonobject.keys()
是多余的,会创建一个新的字典视图对象

对于你的字典来说这是正确的,但这不是你测试的唯一目的。你的测试是:

if 'lap' in jsonobject and jsonobject['lap'] is not None:
如果
'lap'
是一个键,但字典中的值是
None
,则该操作将失败

上述测试可以更简单、简洁地表述为:

if jsonobject.get('lap') is not None:

如果
None
是一个有效值,不要测试它;只在jsonobject中使用
'lap

不要使用
key in dict.keys()
key in dict
可以时,不要使用
key in dict.keys()
测试属性。字典键不是属性。
hasaattr(dict,key)
将始终失败,除非
是实际的字典属性,如
。如果
存在“圈数”
,但值设置为
,则您的
不是无
测试将为假。这并不意味着键不存在。@MartijnPieters当存在圈数时,
就我在数据中看到的情况来看,t从来都不是空的-我在数据中有它只是为了小心。但是你是正确的,尽管dict.values中的键不起作用,但dict中的键起作用了。你在那里使用的是令人困惑的语言。你使用的是
jsonobject.values()
?它永远不会包含
'lap'
,因为值不是键。您还忽略了
jsonobject.keys
jsonobject.values
中的
()
。如果不调用这些方法,
测试中的
肯定会失败(例外)。
if jsonobject.get('lap') is not None: