遇到一个处理超大json(接近2w行)的问题,原有处理代码效率比较低下,耗时10几秒,业务要求耗时越短越好。
思维转换:一般的思维是遍历json的所有字段,对符合条件的进行转换,但是效率低下,还有大量的正则匹配操作。
逆向思维,只对配置中指定的字段进行转换,非配置中的直接跳过,可以大幅提升速度。
原有json格式如下:
{
"a": {
"b": [
{
"c": {
"c1": "NT",
"c2": "24",
"c3": "76413",
"c4": "2026-06-24"
}
}
]
}
}
配置文件格式如下:
a=A
a.b= B
a.b.c= C
a.b.c.c1= C1
a.b.c.c2= C2
a.b.c.c3= C3
a.b.c.c4= C4
要求替换整个json的路径如下:
{
"A": {
"B": [
{
"C": {
"C1": "NT",
"C2": "24",
"C3": "76413",
"C4": 1548950400000
}
}
]
}
}
并且需要对C4即月份的字段进行时间转换。
因为json非常长,原来对value进行解析的逻辑是逐个字段进行正则匹配判断是否是月份,所以导致效率非常低。
优化以后建立映射字段,存储月份对应的码值,遇到对应码值直接返回,原来正则表达式没有进行预编译,所以效率低下。
/**
* 月份字段对应码值
*/
public static final Set<String> MOUTH_CODE = new HashSet<>();
static {
MOUTH_CODE.add("C4");
MOUTH_CODE.add("D4");
MOUTH_CODE.add("E4");
MOUTH_CODE.add("F4");
}