Лучший подход для поиска подходящих записей в двух файлах 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 ответа
Если это единственная проблема, которую вам нужно решить с данными, самый быстрый подход заключается в следующем:
Проанализируйте всех издателей и сохраните идентификатор (или любую другую дополнительную информацию, которую вы хотели бы сохранить для вывода) в хэш-карте, где ключом является имя издателя. Если вы хотите сопоставить имя и страну, вы можете использовать такой ключ, как
<publisherName>/<publisherCountry>
и это лучше всего работает, если используемый вами разделитель не встречается в данных. Например<publisherName>\n<publisherCountry>
как я полагаю, в этих именах есть разрывы строк.Теперь разберите все книги, составьте ключ из данных, например снова
<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
}
Заметки:
- Этот синтаксис называется пониманием, и вы можете использовать его для простого создания хеш-карт или списков в одном выражении. Хеш-карты Python называются dicts.
- Здесь вы выбрали уникальный ключ для каждой книги / издателя и соответствующее значение.
- Здесь вы решили, как связать книгу с издателем. Здесь я просто объединяю слова книги и издательства в один.