有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我有两个JSON文件——publisher有一个出版商列表,Books有一个图书列表。我必须将这本书与相应的出版商进行匹配。这两个文件的格式如下:

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. # 1 楼答案

    你基本上是在图书和出版商之间根据出版商的名字进行一个内部连接。 可以使用关联数组(或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. 这是您选择如何将书与出版商关联的地方。在这里,我只是把这本书和出版商的口述合并成一个
  2. # 2 楼答案

    如果这是你必须在数据上解决的唯一问题,最快的方法是:

    1. 解析所有发布者,并将id(或您希望为输出保留的任何其他附加信息)存储在哈希映射中,其中发布者名称是密钥。如果想同时匹配姓名和国家,可以使用<publisherName>/<publisherCountry>这样的键,如果数据中不出现自然使用的分隔符,效果最好。例如<publisherName>\n<publisherCountry>,因为我假设这些名称中有换行符

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