Python request.json()对象作为字典无法使用hasattr()或object.keys()调用中的值识别其自身的键 - python

摘要:dictionary / json对象指示它没有给定键(即使该键出现在hasattr调用中,也使用value in object.keys调用或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对象中删除这些字段,因为它们仍然不包含有用的信息。

问题在于,对于hasattr(jsonobject,'laps')和hasattr(jsonobject,'points',json对象总是返回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,即使再次击打也会打印出包含“ laps”的相同键数组。

python大神给出的解决方案

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

要测试键,请直接对字典使用in测试:

if 'lap' in jsonobject:

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

这对您的字典来说是正确的,但这并不是您要测试的唯一内容。您的测试是:

if 'lap' in jsonobject and jsonobject['lap'] is not None:

如果'lap'是键,但是字典中的值是None,则将失败。

上面的测试可以更简单,更紧凑地陈述为:

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

如果None是有效值,请不要进行测试;坚持'lap' in jsonobject