这是一个关于思路的问题,所以请不要让我使用第三方库来解决这个问题。
最近,我接受了一次面试,有以下问题:
有一个庞大的JSON文件,结构类似于数据库:
{
"tableName1 ":[
{"t1field1":"value1"},
{"t1field2":"value2"},
...
{"t1fieldN":"valueN"}
],
"tableName2 ":[
{"t2field1":"value1"},
{"t2field2":"value2"},
....
{"t2fieldN":"valueN"}
],
.......
.......
"tableNameN ":[
{"tNfield1":"value1"},
{"tNfield2":"value2"},
....
{"tNfieldN":"valueN"}
]
}
要求是:
当它是一个正常大小的JSON文件时,我编写了一个Utility类来从本地加载JSON文件并将其解析为JSON Object。然后我写了两个方法来处理这两个要求:
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文件时,我将输入流String与taget nodeName进行比较,然后开始计算子节点的对象数,如果规则是100,那么当它有100个对象时,我将子进行分割-node到一个新的较小的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对象。
这是一个关于思路的问题,所以请不要告诉我你可以使用第三方库来解决这个问题。
所以如果我的可行性呢?或者你们有其他想法,请分享。
感谢。