Php 在两个JSON文件之间生成值差异
我有一个JSON主配置文件,其值可能会被JSON中特定帐户的配置文件覆盖 主文件 配置文件 请注意,它们是相同的,但某些值section01Config.setting03、section02Config.setting01和section03Config.setting02不同。还请注意,两个文件中的整个section4Configs块是相同的 不需要相同的文件,因为应用程序同时加载并用帐户配置中不同的文件覆盖主文件 我想做的是有一个脚本,它可以遍历此类帐户文件的目录,并删除每个文件中与主文件具有相同键和值的条目。从本例中,我将得到如下文件:Php 在两个JSON文件之间生成值差异,php,json,bash,perl,Php,Json,Bash,Perl,我有一个JSON主配置文件,其值可能会被JSON中特定帐户的配置文件覆盖 主文件 配置文件 请注意,它们是相同的,但某些值section01Config.setting03、section02Config.setting01和section03Config.setting02不同。还请注意,两个文件中的整个section4Configs块是相同的 不需要相同的文件,因为应用程序同时加载并用帐户配置中不同的文件覆盖主文件 我想做的是有一个脚本,它可以遍历此类帐户文件的目录,并删除每个文件中与主文件
{
section1Configs: {
setting03: true
},
section2Configs: {
setting01: false
},
section3Configs: {
setting02: false
}
}
{
"section3Configs": {
"setting02": true
},
"section1Configs": {
"setting03": false
},
"section2Configs": {
"setting01": true
}
}
假设这两个文件是格式良好的JSON,并且始终具有与您的示例相同的结构(特别是深度),则解决方案很简单: 在PHP中:
$master = json_decode($master, true);
$config = json_decode($config, true);
$result = [];
foreach ($master as $ksec => $vsec) {
$secTmp = [];
foreach ($vsec as $kset => $vset) {
if ($master[$ksec][$kset] !== $config[$ksec][$kset])
$secTmp[$kset] = $config[$ksec][$kset];
}
if ($secTmp)
$result[$ksec] = $secTmp;
}
echo json_encode($result);
我知道OP没有请求Python,但为了防止有人有类似的问题,不想为运行甚至安装PHP和Apache而烦恼,这里有一个简单的Python实现
import json
with open('json1.json') as data_file:
master = json.load(data_file)
with open('json2.json') as data_file:
config = json.load(data_file)
result = {}
for section in master:
for attribute, value in master[section].items():
if not config[section][attribute] == value:
result.update({section: {}})
result[section].update({attribute: value})
with open('result.json', 'w') as f:
json.dump(result, f, indent=4)
注意:解决方案不保持属性或节的顺序。它还需要并生成,如下所示:
{
section1Configs: {
setting03: true
},
section2Configs: {
setting01: false
},
section3Configs: {
setting02: false
}
}
{
"section3Configs": {
"setting02": true
},
"section1Configs": {
"setting03": false
},
"section2Configs": {
"setting01": true
}
}
你可以使用任何其他编程语言,比如perl吗?我不懂perl,但可以努力让它运行。因此,如果您对Perl有一个建议,那也很好。并不是所有的键都缺少引号。这仅仅是一个错误,还是你的文件没有把它们放在任何地方?正如你所说的,对于了解PHP的人来说,这是非常微不足道的;这足够让我走了。谢谢