使用特定键优雅地替换嵌套JSON中的值的最短方法

时间:2017-08-15 10:16:00

标签: python json

想象一下嵌套的json结构如下:

node = 
{
  "0" : {
    "param" : {
      "filename" : "abc",
      "delimiter" : "n"
    },
    "function" : "do something"
  },
  "1" : {
    "param" : {
      "filename" : "def",
      "delimiter" : "n"
    },
    "function" : "do something"
  },
  "2" : {
    "param" : {
      "filename" : "ghi",
      "delimiter" : "n"
    },
    "function" : "do something"
  }
}

我希望将节点变量中的所有文件名替换为计算文件名。例如,我想将“0”,“1”和“2”中的所有文件名值替换为“example.pdf”。

Python中最优雅的方式或最短的方法是什么?

3 个答案:

答案 0 :(得分:1)

正则表达式怎么样?

In [29]: import re

In [30]: json.loads(re.sub('(?<="filename": ")(.*?)(?=")', 'example.pdf',  json.dumps(node)))
Out[30]: 
{'0': {'function': 'do something',
  'param': {'delimiter': 'n', 'filename': 'example.pdf'}},
 '1': {'function': 'do something',
  'param': {'delimiter': 'n', 'filename': 'example.pdf'}},
 '2': {'function': 'do something',
  'param': {'delimiter': 'n', 'filename': 'example.pdf'}}}

如果您不想替换每个实例,则无效。

答案 1 :(得分:0)

我不知道它是否优雅,但我会这样做:

for k,v in node.items():
    v["param"]["filename"]="foo{}.pdf".format(k)

迭代字典键/值,&#34;导航&#34;到相关领域并进行更改(将其与要说明的关键值相关联)

(使用字典理解重建字典似乎有点过分了)

答案 2 :(得分:0)

万一你的密钥&#39; param&#39;并不总是相同,甚至不知道,你可以使用这个:

for k1, v1 in node.items():
    for k2, v2 in v1.items():
        if 'filename' in v2:
            node[k1][k2]['filename'] = 'example.pdf'