【问题标题】:Optimised Approach to parse n JSON object parallel and form aggregated json并行解析n个JSON对象并形成聚合json的优化方法
【发布时间】:2019-10-25 15:56:09
【问题描述】:

作为解析多个 JSON 并将生成的 JSON 聚合为最终输出的有效实现的一部分。

假设:

Json1 : 

[
{
  "id":"abc",
  "name" : "json"
},
... having 10k json objects
]

Json2: 

[
{
  "id":"abc",
  "language" : "java"
},
... having 10k json objects
]

Json3: 

[
{
  "id":"abc",
  "subject" : "solving"
},
... having 10k json objects
]

从 3 个 jsons 中,要求是 1.优化了在3个json中搜索属性“id”的方式,如果匹配映射这些json对象到最终的json对象。

遵循的方法

我尝试了以下方式

遍历第一个 JSON 数组对象并找到一个属性“id”并遍历剩余的 JSON 并查看匹配的“id”和相应的 JSON 对象合并并形成最终对象 在这个过程中, 花费 O(n^3) 时间搜索找到匹配的记录 就我而言,更多的是 n > 10k

最好的方法是什么

【问题讨论】:

  • 是的,您的方法似乎还可以,如果您不知道流(json)中的ID在哪里,则需要将它们逐个流式传输(查找全部),没有办法, 有关如何流式传输的信息,请参见 stackoverflow.com/q/25064773/5292302
  • 但是在这种方法中会消耗辅助空间,这会影响应用程序。我们是否有任何现有的库或模式来实现这一目标
  • 我不知道其他人,将所有对象映射到对象,但它们检查速度较慢且消耗更多内存

标签: java json jackson gson


【解决方案1】:

假设您已经知道所有可能的 JSON 字段并且id 是一个唯一属性, 创建一个 java 对象来反映所有字段。

class MyObject{
    String id;
    String name; 
    String language;
    String subject;
}

然后创建一个键值对列表,以id为键。并且每当您找到id 时,如果它存在于键值对列表中,则修改相应的对象。否则创建一个新对象并将其作为新的键值对添加到列表中。这样,您将只遍历每个 JSON 一次,但可能会占用大量辅助空间。

【讨论】:

  • 您可以使用 Map 创建键值对列表
  • 其成本辅助空间会影响应用程序停机时间。是否有任何库或模式可用于实现这一目标
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-14
  • 1970-01-01
  • 1970-01-01
  • 2012-08-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多