Php 在两个JSON文件之间生成值差异

Php 在两个JSON文件之间生成值差异,php,json,bash,perl,Php,Json,Bash,Perl,我有一个JSON主配置文件,其值可能会被JSON中特定帐户的配置文件覆盖 主文件 配置文件 请注意,它们是相同的,但某些值section01Config.setting03、section02Config.setting01和section03Config.setting02不同。还请注意,两个文件中的整个section4Configs块是相同的 不需要相同的文件,因为应用程序同时加载并用帐户配置中不同的文件覆盖主文件 我想做的是有一个脚本,它可以遍历此类帐户文件的目录,并删除每个文件中与主文件

我有一个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的人来说,这是非常微不足道的;这足够让我走了。谢谢