使用正则表达式的JSON字符串操作

时间:2017-11-07 03:57:30

标签: java json regex

您好我一直试图让正则表达式替换JSON字符串键名中的点(。)。我不想使用JSONObject将字符串转换为JSON。

因此对于JSON字符串,如:

{
    "data": {
        "property": "0",
        "property_value": "0",
        "property": "0",
        "pro.per.ty": "0",
        "pr.op.er.ty": "0.0",
        "property": "0.0",
        "proper_ty": "0.0",
        "group": "oneGroup",
        "newprop": "0",
        "total": {
            "0": "0",
            "99": "0",
            "100": "0",
            "25": "0",
            "90": "0",
            "50": "0",
            "95": "0",
            "99.5": "0",
            "75": "0"
        },
        "requests": "0"
    }
}

我希望最后一个字符串是

{
    "data": {
        "property": "0",
        "property_value": "0",
        "property": "0",
        "pro_per_ty": "0",
        "pr_op_er_ty": "0.0",
        "property": "0.0",
        "proper_ty": "0.0",
        "group": "oneGroup",
        "newprop": "0",
        "total": {
            "0": "0",
            "99": "0",
            "100": "0",
            "25": "0",
            "90": "0",
            "50": "0",
            "95": "0",
            "99_5": "0",
            "75": "0"
        },
        "requests": "0"
    }
}

解决方案需要在10毫秒的时间内保持高性能。

我可以使用表达式"(\w*\.\w*)+\":使用(。)捕获键,但是我无法正确地获取子组以执行替换。

2 个答案:

答案 0 :(得分:0)

我能够提出以下内容,但不确定是否可以通过减少创建的String个对象的数量来改善这个目标

String cleanse(final String jsonString){
Pattern pattern = Pattern.compile("((?:\\w*\\.\\w*)+)\"\\s*?:");
String str = jsonString;
Matcher matcher = pattern.matcher(str);
while(matcher.find()) {
str = str.replace(matcher.group(1),matcher.group(1).replaceAll("\\.","_"));
}
return str;
}

答案 1 :(得分:0)

您还可以考虑以下非基于正则表达式的方法:

public static String cleanse( String str )
{
    String updated = Arrays.stream( str.split( "," ) ).map( value -> {
        if ( !value.contains( ":" ) )
        {
            return value;
        }
        String[] pair = value.split( ":" );
        StringBuilder sb = new StringBuilder();
        int i = 0;
        while ( i < pair.length - 1 )
        {
            sb.append( pair[i] ).append( ":" );
            i++;
        }
        return sb.toString().replace( '.', '_' ) + pair[i];
    } ).collect( Collectors.joining( "," ) );

    return updated;
}

因为它没有使用模式匹配所以它应该是高性能的。