我正在使用一个返回JSON对象的API,我很容易将其转换为dict。我们将调用转换后的JSON-to-dict对象JSON_API_ITEM。
但是,有时JSON_API_ITEM没有某些字段(例如url)。而不是将该字段设置为None,该字段根本不存在,因此当我进行分配时:
url = JSON_API_ITEM['url']
我的程序抛出异常。我想过在dict.keys()中使用for循环或将所有内容放在try或if块中,但这会使我的代码非常难看。
处理这样的事情的pythonic方法是什么?
答案 0 :(得分:3)
尽管.get()
有效并且是最短(我认为)这样做的方式,但更多的Pythonic方式是EAFP或者#34;比宽容更容易要求宽恕"。这意味着try / except块是您应该如何做的:
try:
url = my_item['url']
except KeyError e:
url = None
我在这里假设您打算写url = my_item['url']
,而不是my_item['url'] = url
我看到有关.get()
的答案已被删除。我也会解释它。
您可以使用url = my_item.get('url',None)
; dict.get()
的第二个参数是默认值。它实际上默认为None
,因此您只需编写utl = my_item.get('url')
答案 1 :(得分:2)
您可以使用get方法。
my_item.get('url',None) # None is default in case url key does not exist.
编辑:
我取消删除我的答案,因为在OP编辑之后,明确的问题是关于从字典中获取价值,而不是关于作业。
答案 2 :(得分:0)
当你的问题发生变化时,这个答案超出了范围,但是如果有人需要将分配分配给可能不存在的密钥,而不是仅仅需要访问 EM>
这是在加载的JSON中使用defaultdict而不是dict完成的。转换是使用object_hook
完成的。每当扫描一个JSON对象时调用此钩子(这通常会导致Python中的dict)。在下面的示例中,default_factory
只返回None
,但如果您愿意,可以为您的目的放置一些更有趣的内容(例如,一个空的dict,以便链式getitem
调用不要失败)。
samplejson = """
{
"menu": {
"id": "file",
"value": "File",
"popup": {
"menuitem": [
{ "value": "New", "onclick": "CreateNewDoc()" },
{ "value": "Open", "onclick": "OpenDoc()" },
{ "value": "Close", "onclick": "CloseDoc()" }
]
}
}
}
"""
jsobject = json.loads(
samplejson,
object_hook=lambda obj: collections.defaultdict(lambda:None, **obj)
)
print(jsobject["menu"]["id"])
print(jsobject["menu"]["tooltip"])
jsobject["menu"]["tooltip"] = "File menu"
jsobject["menu"]["accel"] = "Alt+F"
print(jsobject["menu"]["accel"])
print(jsobject["menu"]["tooltip"])
#Output:
#file
#None
#Alt+F
#File menu