2015-07-24 3 views
-1

У меня есть главный файл конфигурации JSON, значение которого может быть перезаписано конфигурационным файлом определенной учетной записи (также в JSON).Создайте различия в значениях между двумя файлами JSON

мастер-файл

{ 
    "section1Configs": { 
     "setting01": true, 
     "setting02": true, 
     "setting03": false 
    }, 
    section2Configs: { 
     "setting01": true, 
     "setting02": true, 
     "setting03": false 
    }, 
    section3Configs: { 
     "setting01": true, 
     "setting02": true, 
     "setting03": false 
    }, 
    section4Configs: { 
     "setting01": true, 
     "setting02": true, 
     "setting03": false 
    } 
} 

конфигурационный файл

{ 
    "section1Configs": { 
     "setting01": true, 
     "setting02": true, 
     "setting03": true 
    }, 
    section2Configs: { 
     "setting01": false, 
     "setting02": true, 
     "setting03": false 
    }, 
    section3Configs: { 
     "setting01": true, 
     "setting02": false, 
     "setting03": false 
    }, 
    section4Configs: { 
     "setting01": true, 
     "setting02": true, 
     "setting03": false 
    } 
} 

Обратите внимание, что они идентичны, за исключением определенных значений (section01Config.setting03, section02Config.setting01 и section03Config.setting02) различны. Также обратите внимание, что весь блок section4Configs в обоих файлах одинаковый.

Те же, что и они, не нужны, так как приложение загружает оба и перезаписывает главный файл с теми, которые отличаются в конфигурации учетной записи.

Что бы я хотел сделать, это иметь скрипт, который выполняет итерацию через каталог таких файлов учетных записей и удаляет запись в каждом файле, которые являются тем же ключом и значением, что и главный файл. Из этого примера я бы в конечном итоге с файлом, как это:

{ 
    section1Configs: { 
     setting03: true 
    }, 
    section2Configs: { 
     setting01: false 
    }, 
    section3Configs: { 
     setting02: false 
    } 
} 
+0

У вас есть доступ к любому другому языку программирования, например perl? – pooley1994

+0

Я не знаю Perl, но могу приложить усилия, чтобы заставить его работать. Поэтому, если у вас есть предложение с Perl, это тоже хорошо. – vdiaz1130

+0

Не все ваши ключи [хорошо сформированы] (http://stackoverflow.com/questions/949449/json-spec-does-the-key-have-to-be-surrounded-with-quotes) (они пропускают кавычки). Это просто ошибка, или ваши файлы не имеют их везде? – sjaustirni

ответ

1

Предполагая, что два файла хорошо сформирована 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); 
+0

Это довольно тривиально, как вы сказали, для кого-то, кто знает PHP;) Этого достаточно, чтобы заставить меня двигаться. Благодаря! – vdiaz1130

1

Я знаю, что ОП не запрашивал 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) 

Примечание: Решение не сохраняет порядок attribute с ни section с. Он также требует (и генерирует) well-formed JSON, который выглядит следующим образом:

{ 
    "section3Configs": { 
     "setting02": true 
    }, 
    "section1Configs": { 
     "setting03": false 
    }, 
    "section2Configs": { 
     "setting01": true 
    } 
} 
Смежные вопросы