使用递归从JSON嵌套和展平字典

时间:2017-12-05 16:50:27

标签: python json

我有以下.json文件:

{
    "level1_one":"1",
    "level1_two":{
        "level2_one":"2",
        "level2_two":{
            "level3_one":"bottom"
        }
    }
}

我需要像这样给它嵌套和展平的表示:

{
    "level1_two": {
        "level2_two": {
            "level3_one": "bottom"
        },
        "level2_one": "2"
    },
    "level1_one": "1"
}

{
    "level2_one": "2",
    "level3_one": "bottom",
    "level1_one": "1"
}

我知道只需执行此操作即可轻松实现嵌套表单:

def json_parser(filename):
    data = json.load(open(filename))
    print(data)

问题是需要通过对两种情况使用递归来完成。我尝试了几乎所有我能找到的东西,但没有取得多大成功。我怎么能这样做?

2 个答案:

答案 0 :(得分:1)

你可以试试这个:

s = {
"level1_one":"1",
"level1_two":{
    "level2_one":"2",
    "level2_two":{
        "level3_one":"bottom"
    }
  }
}
def flatten(s):   
   for i in s:
      if not isinstance(s[i], dict):
          yield (i, s[i])
      else:
           for b in flatten(s[i]):
              yield b

new_data = dict(list(flatten(s)))

输出:

{'level2_one': '2', 'level3_one': 'bottom', 'level1_one': '1'}

答案 1 :(得分:0)

像这样的东西

def flatten_dict(d):
    def items():
        for key, value in d.items():
            if isinstance(value, dict):
               for subkey, subvalue in flatten_dict(value).items():
                    yield subkey, subvalue
            else:
                yield key, value

    return dict(items())

返回

{'level1_one': '1', 'level2_one': '2', 'level3_one': 'bottom'}

您发布的示例