Сравнивая несколько словарей из файлов JSON?

Я бы просто связал имя столбца и порядок с SQL-запросом, но только после того, как

  1. подтвердил, что имя столбца и порядок действительны в этом контексте.
  2. , дезинфицируя их, чтобы противостоять любой попытке атаки SQL Injection .

Я считаю, что это эффективно по сравнению с получением результатов на прикладном уровне и их сортировкой здесь.

-1
задан RD Department 17 January 2019 в 14:37
поделиться

3 ответа

Как я сказал в комментарии, содержимое ваших двух входных файлов не соответствует формату JSON.

Вот их модифицированные версии для включения тестирования:

suggested.json:

{
    "suggested": [
        {
            "city": "Berlin",
            "location": "Europe",
            "hotels": true,
            "restaurants": true,
            "rivers": false
        },
        {
            "city": "Andorra",
            "location": "Global",
            "hotels": false,
            "restaurants": true,
            "rivers": true
        }
    ]
}

master.json:

{
    "master": [
        {
            "city": "",
            "location": "Europe",
            "hotels": true,
            "restaurants": false,
            "rivers": false
        }
    ]
}

И вот модифицированная версия вашего кода, которая будет обрабатывать их так, как вы хотите:

import json


def openJsonFile(file):
    with open(file) as json_data:
        workData = json.load(json_data)
        return workData


def compareJsonFiles(suggested, master):
    master_dict = master['master'][0]  # Assumes only one object in the list.

    for suggestion in suggested['suggested']:
        print('checking suggestion:', suggestion)
        matches = 0
        for key, value in suggestion.items():
            if key not in master_dict:
                print ("  {0} doesn't have value in {1}".format(key, master_dict))
            else:
                if master_dict[key] == value:
                    print("  for key %r values match" % key)
                    matches += 1
        print('  there were {} matches'.format(matches))


suggested = openJsonFile('suggested.json')
master =  openJsonFile('master.json')

compareJsonFiles(suggested, master)

Вот вывод, который он производит, учитывая два вышеупомянутых файла:

checking suggestion: {'city': 'Berlin', 'location': 'Europe', 'hotels': True, 'restaurants': True, 'rivers': False}
  for key 'location' values match
  for key 'hotels' values match
  for key 'rivers' values match
  there were 3 matches
checking suggestion: {'city': 'Andorra', 'location': 'Global', 'hotels': False, 'restaurants': True, 'rivers': True}
  there were 0 matches
0
ответ дан martineau 17 January 2019 в 14:37
поделиться

Ваш master узел - это список, а не словарь. Если вы уверены, что мастер всегда содержит только одну запись, пропустите ее через

compareJsonFiles(suggested_data, master_data[0])
0
ответ дан Slam 17 January 2019 в 14:37
поделиться

Взгляните на Цербер (не путать с Kerberos) http://docs.python-cerberus.org/en/stable/usage.html#basic-usage

[112 ] Все, что вы хотите, и даже больше - проверка данных JSON общего назначения и применение схем.

0
ответ дан nigel222 17 January 2019 в 14:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: