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

java json algorithm jackson matching

324 просмотра

2 ответа

У меня есть два 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, чтобы найти совпадение?

Автор: Lalit Agarwal Источник Размещён: 08.11.2019 11:21

Ответы (2)


0 плюса

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

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

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

Автор: ypnos Размещён: 20.08.2016 01:20

0 плюса

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

Вот пример реализации в 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. Здесь вы решили, как связать книгу с издателем. Здесь я просто объединяю слова книги и издательства в один.
Автор: kjaquier Размещён: 20.08.2016 01:48
Вопросы из категории :
32x32