0

这是一个关于思路的问题,所以请不要让我使用第三方库来处理这个问题。

最近,我去面试了,有这样一个问题:

有一个巨大的 JSON 文件,结构类似于数据库:

    {
    "tableName1 ":[
       {"t1field1":"value1"},
       {"t1field2":"value2"},
          ...
       {"t1fieldN":"valueN"}
        ], 
    "tableName2 ":[
       {"t2field1":"value1"},
       {"t2field2":"value2"},
          ....
       {"t2fieldN":"valueN"}
        ],
        .......
        .......
     "tableNameN ":[
       {"tNfield1":"value1"},
       {"tNfield2":"value2"},
          ....
       {"tNfieldN":"valueN"}
    ]
   }

并且要求是:

  1. 通过给定的子节点名称找到一些特殊的子节点并更新它的字段值,然后将其保存到新的 JSON 文件中。
    1. 计算给定字段的名称和值的数量。

当它是一个正常大小的 JSON 文件时,我编写了一个实用程序类来从本地加载 JSON 文件并将其解析为 JSON 对象。然后我写了两个方法来处理这两个需求:

void upDateAndSaveJson(JSONObject json, String nodeName,
            Map<String, Object> map, Map<String, Object> updateMap,
            String outPath) {
     //map saved target child-node's conditions
     //updateMap saved update conditions
     // first find the target child-node and update it finally save it
     // ...code ... 
}
int getCount(JSONObject json, Map<String, Object> map) {
  //map saved field target field/value 
  // ...code...
}

但是面试官让我思考一下JSON文件非常庞大的情况,然后修改我的代码以及如何让它更有效。

我的想法是先写一个工具来分割 JSON 文件。因为最后我需要使用 JSON 对象来调用前两个方法,所以在拆分巨大的 JSON 文件之前,我知道这两个方法的参数:一个 Map(保存的目标子节点的条件/或字段目标字段/值),nodeName (子节点名称)

因此,当我加载 JSON 文件时,我将 inputstream String 与 taget nodeName 进行比较,然后开始计算子节点的对象数,如果规则为 100,那么当它有 100 个对象时,我将子节点拆分为一个新的较小的 JSON 文件并将其从源 JSON 文件中删除。

如下所示:

   while((line = reader.readLine()) != null){           
        for (String nodeName : nodeNames) {
            //check if its' the target node
            if (line.indexOf(nodeName) != -1) {
                //count the target child-node's object 
                //and then split to smaller JSON file
            }   
        }
    }

之后,我可以使用多线程加载之前创建的较小的 JSON 文件,并调用这两种方法来处理 JSON 对象。

这是一个思路问题,所以请不要告诉我你可以使用第三方库来处理这个问题。

那么如果我的虽然可行呢?或者你们还有什么其他的想法,请分享一下。

谢谢。

4

0 回答 0