簡體   English   中英

Python request.json()對象作為字典無法使用hasattr()或object.keys()調用中的值識別其自身的鍵

[英]Python requests.json() object as dictionary does not recognize its own keys with hasattr() or value in object.keys() call

摘要:dictionary / json對象指示它沒有給定的鍵(使用hasattr調用或value in object.keys布爾測試中的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”的相同鍵數組。

hasattr()完全是使用錯誤的工具。 它測試屬性,但是字典鍵不是屬性。

要測試鍵,請直接在字典中使用in test:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM