Сравните два json файла с одинаковым именем, но разными значениями в двух файлах - PullRequest
0 голосов
/ 17 апреля 2020

У меня есть два json файла с содержанием, подобным следующему:

Файл1:

    {
      "name": "SES_ENABLED",
      "value": "true"
    },
    {  
        "name":"SES_ADDRESS",
        "value":"email-xxxxxx.aws.com"    
    },
    {  
        "name":"SES_FROM_EMAIL",
        "value":"abc@gmail.com"  
    },
    {  
        "name":"SES_TO_EMAIL",
        "value":"123@gmail.com"  
    }

Файл 2:

   {
      "name": "SES_ENABLED",
      "value": "false"
    },

    {  
        "name":"SES_FROM_EMAIL",
        "value":"xyz@gmail.com"  
    },
    {  
        "name":"SES_ADDRESS",
        "value":"emails-xyzyzyz.aws.com"    
    }

В приведенных выше двух файлах Переменная name будет такой же, но значения будут другими, а порядок будет другим, а также есть дополнительное поле в файле 1

т.е.

{
   "name": "SES_TO_EMAIL"
   "value": "123@gmail.com"
}

Из файла1, как я могу сравнить файл2 для общего переменные "name" присутствуют, а также если в file2 отсутствует какое-либо поле, кроме file1, как я могу это получить.

Например:

После сравнения file1 с file2, Мне нужно получить вывод, как "name": "SES_TO_EMAIL" нет в файле 2.

Любое решение будет очень полезно.

Заранее спасибо:)

Ответы [ 2 ]

1 голос
/ 17 апреля 2020

Предполагая, что каждый файл содержит поток объектов, простая программа, как показано ниже, сделает свое дело.

reduce inputs.name as $name ({}; .[input_filename] += [$name])
| (keys_unsorted | combinations(2)) as $pair
| (.[$pair[0]] - .[$pair[1]])[]
| "name: \(.) is not present in \($pair[1])"

Вызов:

jq -rnf prog.jq file1 file2 file3 ...
0 голосов
/ 17 апреля 2020
def compare(files):
    # store all name into list of list
    names = [[prop['name'] for prop in file] for file in files]
    for i, name in enumerate(names):
        # create a temporary list
        temp_name = names.copy()
        # remove current name in list
        temp_name.pop(i)
        for n in name:
            for j, temp in enumerate(temp_name):
                if not (n in temp): # if name in not present in the other file, print it
                    print('name: {} is not present in file {}'.format(n, (j+1 if j < i else j + 2)))

это мой наивный способ, нам нужно сохранить все имена в list и сравнить каждое имя с этим списком. чтобы использовать это просто

import json
# open the first file
with open('file1.json', 'r') as file:
    file1 = json.load(file)
# open the second file
with open('file2.json', 'r') as file:
    file2 = json.load(file)
# then compare them
compare([file1, file2])

вывод будет таким

name: SES_TO_EMAIL is not present in file 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...