【问题标题】:How to convert JSON into multiple dictonaries using Python如何使用 Python 将 JSON 转换为多个字典
【发布时间】:2016-09-20 22:50:32
【问题描述】:

我想采用以下 JSON 并将其转换为多个字典,这样我就可以仅访问该环境的顶级节点下的每个设置。这是一个配置文件,它将维护不同环境的设置,我希望能够获取顶级节点/环境,然后仅针对该环境使用所有底层节点/设置。

我的 JSON 示例

{“默认”:

{

"build": {
  "projectKey": "TEST",
  "buildKey": "ME"
},
"headers": {
  "json": "application/json",
  "xml": "application/xml"
}

},

“开发”:{

"build": {
  "projectKey": "TEST",
  "buildKey": "YOU"
},
"headers": {
  "json": "application/json",
  "xml": "application/xml"
}

},

“qa”:{

"build": {
  "projectKey": "TEST",
  "buildKey": "THEM"
},
"headers": {
  "json": "application/json",
  "xml": "application/xml"
}

} }

我尝试通过提取顶级键来执行此操作,但看不到如何使用 Python 将它们分解为多个字典,因此我可以收集每个环境的设置并在不重复的情况下使用它们。通过检查节点的 len 检查我可以看到的底层节点,看看下面是否还有更多节点,但是从顶层开始并将每个节点拆分为自己的 dict 我无法解决。

或者也许有比我不知道的更好的方法来做到这一点。下面的长度可能会有所不同,但如果我可以将它们分开,那应该是无关紧要的。

【问题讨论】:

  • “将其压平成字典” - 你将不得不解释你的实际意思。
  • @user2357112 这样会更清楚吗?扁平化是我为此考虑的一个术语,而不是 JSON 节点。不应该在这里使用它
  • 不,还不清楚。你认为“JSON 节点”是什么,为什么你认为你还没有字典?听起来您确实已经有了字典。那,或者你有一个字符串,在这种情况下你会使用json.loads(your_string) 来解析它并得到一个字典,但听起来你已经有了一个字典。
  • 听起来您可能只需要更熟悉循环和索引。例如,您可以使用 for env_name, env_settings in your_dict.items() 遍历字典的条目。

标签: python json dictionary configuration


【解决方案1】:

您的问题确实令人困惑,但我会尝试猜测一下,假设您有一个 json 文件(我将使用 python3.x io.StringIO 模拟它)。

我假设你想知道如何将该文件加载到 python 字典中,使用json.load 方法来做到这一点,你已经完成了。这是一个 mcve 示例,向您展示如何加载假设文件,然后使用不同的配置对其进行处理:

import json
import io

f = io.StringIO("""{
    "default": {
        "build": {
            "projectKey": "TEST",
            "buildKey": "ME"
        },
        "headers": {
            "json": "application/json",
            "xml": "application/xml"
        }
    },
    "dev": {
        "build": {
            "projectKey": "TEST",
            "buildKey": "YOU"
        },
        "headers": {
            "json": "application/json",
                    "xml": "application/xml"
        }
    },
    "qa": {
        "build": {
            "projectKey": "TEST",
            "buildKey": "THEM"
        },
        "headers": {
            "json": "application/json",
            "xml": "application/xml"
        }
    }
}""")


def processor(config, stage):
    print('----Processing stuff for {0} server----'.format(stage))
    print(config[stage])
    print('----End----')

config = json.load(f)

for stage in ['default', 'dev', 'qa']:
    processor(config, stage)

【讨论】:

    【解决方案2】:

    有标准库可以做到这一点

    import json
    my_dct = json.loads(json_string)
    

    更多信息,请参阅https://docs.python.org/3.5/library/json.html#json.loads

    【讨论】:

      【解决方案3】:

      将以上数据存储在如下变量中,并使用 json.loads 将其转换为 dict 它将文本转换为字典,然后您可以基于 env 循环遍历字典以获取属性

      text='''
      { "default":
      
      {
      
      "build": {
        "projectKey": "TEST",
        "buildKey": "ME"
      },
      "headers": {
        "json": "application/json",
        "xml": "application/xml"
      }
      
      },
      
      "dev": {
      
      "build": {
        "projectKey": "TEST",
        "buildKey": "YOU"
      },
      "headers": {
        "json": "application/json",
        "xml": "application/xml"
      }
      
      },
      
      "qa": {
      
      "build": {
        "projectKey": "TEST",
        "buildKey": "THEM"
      },
      "headers": {
        "json": "application/json",
        "xml": "application/xml"
      }
      
      } }'''
      import json
      dict=json.loads(text)
      

      【讨论】:

      • 这实际上非常接近我想要做的......谢谢
      【解决方案4】:

      您需要json.loads() 将您的string 转换为json 对象。下面是打开文件并根据json的结构将json加载为dictlist的代码(在你的情况下为dict

      import json
      json_file = open('/path/to/config_file')
      json_str = json_file.read()
      json_data = json.loads(json_str)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-02-14
        • 2023-03-14
        • 1970-01-01
        • 2011-01-29
        • 1970-01-01
        • 1970-01-01
        • 2019-01-23
        • 1970-01-01
        相关资源
        最近更新 更多