这是一个关于思路的问题,所以请不要让我使用第三方库来处理这个问题。
最近,我去面试了,有这样一个问题:
有一个巨大的 JSON 文件,结构类似于数据库:
{
"tableName1 ":[
{"t1field1":"value1"},
{"t1field2":"value2"},
...
{"t1fieldN":"valueN"}
],
"tableName2 ":[
{"t2field1":"value1"},
{"t2field2":"value2"},
....
{"t2fieldN":"valueN"}
],
.......
.......
"tableNameN ":[
{"tNfield1":"value1"},
{"tNfield2":"value2"},
....
{"tNfieldN":"valueN"}
]
}
并且要求是:
- 通过给定的子节点名称找到一些特殊的子节点并更新它的字段值,然后将其保存到新的 JSON 文件中。
- 计算给定字段的名称和值的数量。
当它是一个正常大小的 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 对象。
这是一个思路问题,所以请不要告诉我你可以使用第三方库来处理这个问题。
那么如果我的虽然可行呢?或者你们还有什么其他的想法,请分享一下。
谢谢。