【问题标题】:Get nested JSON object safely安全地获取嵌套的 JSON 对象
【发布时间】:2020-11-10 01:30:49
【问题描述】:

我有一个嵌套的 JSON 文件 json.loads(f)

f:

 {
     "obj1" : {
         "obj2" : [
        ... more objects
         ]
      }
    }

现在如果我想获取嵌套对象,我首先获取 obj1,检查它是否不是 None,然后获取 obj2

但是,如果我有很多嵌套对象,这会变得很混乱: obj1 -> obj2[0] -> obj3 -> obj4[0] .....

如何在不检查每个对象是否存在的情况下获得嵌套对象的安全性?在 Python 中是否有类似 XPath 之类的东西用于 JSON? 如果没有找到任何对象,它们可以返回 None。

【问题讨论】:

  • 当其中一个键或索引不存在时,您期望得到什么?您可以使用try..except 来捕获所有值错误。
  • @Selcuk 如果找不到任何对象,他们可以返回 None。

标签: python json python-3.x


【解决方案1】:

在 Python 中处理此问题的规范方法是使用 try...except 并捕获特定错误,在本例中为 KeyError。如果您也有可能将索引编入列表,您也可以使用IndexError

例如:

d = {
    "obj1" : {
        "obj2" : [1, 2, 3]
    }
}

# Good keys
try:
    l = d['obj1']['obj2']
except KeyError:
    l = None
    
print(l)
# [1, 2, 3]

# Bad Keys
try:
    l = d['obj10']['obj100']
except KeyError:
    l = None
    
print(l)
# None

# Bad Index
try:
    l = d['obj1']['obj2'][20]
except (KeyError, IndexError):
    l = None
    
print(l)
# None

这是一种通常称为EAFP Easier to ask for forgiveness than permission.的模式

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-27
    • 1970-01-01
    • 1970-01-01
    • 2019-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多