Лучший подход для поиска подходящих записей в двух файлах JSON

У меня есть два JSON Files- Publishers, у которых есть список издателей, и Книги, у которых есть список книг. Я должен сопоставить книгу с соответствующим издателем. Два файла в следующих форматах:

books.json (Около 400 книг):

[{"bookId":"1173828", "bookName":"Dark Sky", "publisher":"ABC", "publisherCountry":"USA"}, ...]

publishers.json (Около 10 издателей);

[{"publisherId":"128", "publisherName":"ABC", "publisherCountry":"USA"}, ...]

Вывод должен иметь форму:

{"results": [{ "bookId": "1173828", "publisherId": 128}, ...]}

Я использую Jackson JSON для разбора файлов. Я хочу знать, как лучше всего использовать эту проблему. Должен ли я создавать отдельные объекты для каждой записи, а затем сравнивать объекты класса Book и Publisher, чтобы найти совпадение?

2 ответа

Если это единственная проблема, которую вам нужно решить с данными, самый быстрый подход заключается в следующем:

  1. Проанализируйте всех издателей и сохраните идентификатор (или любую другую дополнительную информацию, которую вы хотели бы сохранить для вывода) в хэш-карте, где ключом является имя издателя. Если вы хотите сопоставить имя и страну, вы можете использовать такой ключ, как <publisherName>/<publisherCountry> и это лучше всего работает, если используемый вами разделитель не встречается в данных. Например <publisherName>\n<publisherCountry> как я полагаю, в этих именах есть разрывы строк.

  2. Теперь разберите все книги, составьте ключ из данных, например снова <publisher>\n<publisherCountry>и посмотрите это в своем хеше. Теперь вы можете выводить все поля так, как вам нужно.

По сути, вы делаете внутреннее соединение между книгами и издателями на основе имени издателя. Вы можете создать индекс издателей и книг, используя ассоциативный массив (или hashmap). Это свяжет уникальный ключ (скажем, имя издателя) с каждым издателем и книгами. Как только индексы созданы, вы можете выполнить внутреннее соединение между do, перебирая ключи и объединяя данные вместе.

Вот пример реализации в Python:

import json

with open('books.json') as f:
    books = json.load(f)

with open('publishers.json') as f:
    publishers = json.load(f)

books_index = {  # 1
    b['publisher']: {  # 2
        'bookId': b['bookId'],
        'bookName': b['bookName']
    }
    for b in books
}
publishers_index = {
    p['publisherName']: {  # 2
        'publisherId': p['publisherId'],
        'publisherName': p['publisherName'],
        'publisherCountry': p['publisherCountry']
    }
    for p in publishers
}

joined = [
    dict(books_index[k], **publishers_index[k])  # 3
    for k in books_index.keys()
]

results = {
    'results': joined
}

Заметки:

  1. Этот синтаксис называется пониманием, и вы можете использовать его для простого создания хеш-карт или списков в одном выражении. Хеш-карты Python называются dicts.
  2. Здесь вы выбрали уникальный ключ для каждой книги / издателя и соответствующее значение.
  3. Здесь вы решили, как связать книгу с издателем. Здесь я просто объединяю слова книги и издательства в один.
Другие вопросы по тегам