[英]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.