【问题标题】:Python access dictionary containing lists using a path包含使用路径的列表的 Python 访问字典
【发布时间】:2018-03-06 14:35:30
【问题描述】:

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

{   
    "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/network/0/ssid"

    • 应该返回“OpenWrt”

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

我正在考虑分割路径,循环它并检查类型是否是处理列表的列表,但我觉得可能有一种更“pythonic”的方式来做到这一点。

【问题讨论】:

  • 你见过jsonpath吗?如果您的查询是“$.system_configuration.dbus.1”,它就可以工作。
  • 搜索 jsonpath 会返回大量有用的资源.. 拥有正确的关键字再次使一切变得不同。谢谢。

标签: python json list dictionary


【解决方案1】:

由于您可以使用方括号对字典和列表进行索引,因此无需区分两者。 AFNP (Ask for Forgiveness, Not Permission) 是解决这类问题的 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 之禅(import this)说你不应该让错误悄无声息地过去,除非是有意的。

【讨论】:

    猜你喜欢
    • 2019-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-23
    • 2018-09-13
    • 1970-01-01
    • 1970-01-01
    • 2020-09-22
    相关资源
    最近更新 更多