用正则表达式替换部分字符串

时间:2017-06-23 15:52:35

标签: java json regex gson

我的字符串输入类似于:

{"key1":"value1","key2":"{\"key2_1\":\"123\",\"key2_2\":\"456\",\"key2_3\":\"33333\"}"}

上述JSON中的值字段可能包含"\等字符。为了您的方便,这里是格式化的版本:

{
    "key1": "value1",
    "key2": "{\"key2_1\":\"123\",\"key2_2\":\"456\",\"key2_3\":\"33333\"}"
}

我想使用Gson将String转换为Foo对象:

class Foo {
    private String key1;
    private Bar key2;
    ...
}

class Bar {
    private String key2_1;
    private String key2_2;
    private String key2_3;
    ...
}

这是我的正则表达式:

String regexp = "\\{[\"a-zA-Z-0-9:,\\\\]*\"key2\":\"\\{\\\\\"key2_1\\\\\":\\\\\"[a-zA-Z0-9]*\\\\\",\\\\\"key2_2\\\\\":\\\\\"[a-zA-Z0-9]*\\\\\",\\\\\"key2_3\\\\\":\\\\\"[a-zA-Z0-9]*\\\\\"\\}\"\\}[\"a-zA-Z-0-9:,\\\\]*";
Pattern pattern = Pattern.compile(regexp);
Matcher matcher = pattern.matcher(text);
if(matcher.matches()) {
    ... // TODO: Replace all "{, \" and }" but How???
}

我如何使用此正则表达式将所有"{\""}替换为{",{{1不改变JSON中的键和值?

查找子字符串并使用String的replace方法将是我的备份解决方案。

同样,我的最终目标是将输入String解析为我的Foo对象。有没有更好的方法而不是使用正则表达式?

谢谢!

2 个答案:

答案 0 :(得分:2)

黄金法则不要为这些事情使用常规表达 :) 我的建议也是JSON映射器,例如Jackson

您需要做的一切:

  1. 在您的示例中修复JSON,这里不需要围绕嵌套{
  2. 的双引号
  3. 添加杰克逊依赖

    ObjectMapper
  4. 创建ObjectMapper mapper = new ObjectMapper(); Foo foo = mapper.readValue( "{\"key1\":\"value1\",\"key2\":" + " {\"key2_1\":\"123\",\"key2_2\":\"456\",\"key2_3\":\"33333\"}}", Foo.class); System.out.println(foo.toString()); 并让他处理您的JSON字符串

    {{1}}
  5. 希望它有所帮助!

答案 1 :(得分:1)

进一步挖掘后,我找到了这两个链接:

Gson custom deseralizer for one variable in an object

Gson custom seralizer for one variable (of many) in an object using TypeAdapter

我通过注册自己的JsonDeserializerGsonBuilder来实现我的目标:

private static GsonBuilder gsonBuilder = new GsonBuilder().registerTypeAdapter(Bar.class, new JsonDeserializer<Bar>() {

    @Override
    public Bar deserialize(JsonElement json, Type typeOfT,
            JsonDeserializationContext context) throws JsonParseException {
        Bar result = new Bar();
        String regexp = "\"\\{\\\\\"key2_1\\\\\":\\\\\"(?s).*\\\\\".\\\\\"key2_2\\\\\":\\\\\"(?s).*\\\\\",\\\\\"key2_3\\\\\":\\\\\"(?s).*\\\\\"\\}\"";
        Pattern pattern = Pattern.compile(regexp);
        Matcher matcher = pattern.matcher(json.toString());
        String modifiedJsonStr = json.toString();
        if(matcher.matches()) {
            modifiedJsonStr = json.toString().replace("\"{", "{").replace("}\"", "}").replace("\\\"", "\"");
        }
        result = new Gson().fromJson(modifiedJsonStr, Bar.class);
        return result;
    }
});

干杯。