在两个JSON文件中查找匹配记录的最佳方法

时间:2016-08-20 13:14:42

标签: java json algorithm jackson matching

我有两个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 个答案:

答案 0 :(得分:0)

如果这是您必须解决的唯一问题,最快的方法是:

  1. 解析所有发布者,并将ID(或您希望保留的任何其他附加信息)存储在哈希映射中,其中发布者名称是密钥。如果要匹配名称和国家/地区,可以使用<publisherName>/<publisherCountry>之类的密钥,如果数据中没有自然使用的分隔符,则效果最佳。例如<publisherName>\n<publisherCountry>,我认为这些名称中有换行符。

  2. 现在解析所有书籍,从数据构建密钥,例如再次<publisher>\n<publisherCountry>,并在你的哈希中查找。现在,您可以按照需要的方式输出所有字段。

答案 1 :(得分:0)

您基本上是根据发布商名称在图书和发布商之间进行内部联接。 您可以使用关联数组(或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. 您可以在此处选择如何将图书与发布商相关联。在这里,我只是将书籍和出版商的词汇合并为一个。