包含使用路径的列表的Python访问字典

问题描述 投票:-2回答:1

我有一个“复杂”(嵌套了未定义的深度和包含列表)json字典,它存储我的项目的配置设置,该文件的片段:

{   
    "system_configuration": {
      "SYSLOGD_ARGS":"-n -O /var/log/messages"
    , "KLOGD_ARGS":"-n"
    , "dbus": {
          "location":"/usr/share/dbus-1/system.d/ab.conf"
        , "services": [
              "com.stezza.ab"
            , "com.stezza.keyboard"
            , "com.stezza.mpd"
            , "com.stezza.remote"
            , "com.stezza.volume" ]
    }
    , "wpa_supplicant": {
          "location":       "/etc/wpa_supplicant.conf"
        , "ctrl_interface": "/var/run/wpa_supplicant"
        , "update_config":  "1"
        , "network": [
              {   "ssid": "OpenWrt"
                , "psk":  "f22da64fa33936391b0ace4d544c63c5b340877327d31ad028296c875c0d8adb" }
            , {   "ssid": "SecondNetwork"
                , "psk":  "f22da64fa33936391b0ace4d544c63c5b340877327d31ad028296c875c0d8adb" } ]
    }
}

我将json文件加载到Python中的字典中。

考虑到这样的路径,适当的方法是什么:

  • “/ system_configuration / DBUS / 1” 应该返回“com.stezza.keyboard”
  • “/ system_configuration /的wpa_supplicant /网络/ 0 / SSID” 应该返回“OpenWrt”

(背景,可能不相关,这条路径将通过一个烧瓶<path:>-url来找我,作为RESTful API的一部分)

我正在考虑拆分路径,循环遍历它并检查类型是否是列表来处理列表,但我觉得可能有更多“pythonic”方式来执行此操作。

python json list dictionary
1个回答
0
投票

由于您可以使用方括号对字典和列表编制索引,因此无需区分两者。 AFNP(请求宽恕,而非许可)是针对此类问题的pythonic方法。

keys = path.split("/")
acc = json_dict
for key in keys:
    try:
        acc = acc[key]
    except TypeError, KeyError, IndexError:
        acc = None
        break

如果你希望总是在字典中找到条目,那么提高ValueError而不是将acc设置为None会更有意义。 Python的Zen(导入这个)说你不应该让错误无声地传递,除非打算这样做。

© www.soinside.com 2019 - 2024. All rights reserved.