逃离“字符串之间

时间:2014-06-30 09:59:15

标签: java regex replace escaping

我得到一个Json然后使用Gson在一个对象中反序列化它,其中value是一个String而不是一个对象..所以我试图将该对象放入一个String变量 - 而不是反序列化

我想做这样的事情:

"{value" : {"id":"2"}} - > {"value" : "{\"id\":\"2\"}"}

我将"value" : {替换为"value" : "{,如下所示:

result = result.replace("\"value\" : {", "\"value\" : \"{");

然后我像这样替换了}}:

result = result.replace("}}", "}\"}");

我的结果是(在更换所有内容之后):

{"value" : "{"id":"2","name":"game2"}"}

现在唯一的问题是:我还想将"替换为\",但只能在"{ ... }"内取代我无法理解。

编辑:

传入Json:

{"path" : "/gdi/games/2", "key" : "detail", "value" : {"id":"2","name":"game2"}}, 
{"path" : "/gdi/games/4", "key" : "detail", "value" : {"id":"4","name":"game4"}}, 
{"path" : "/gdi/games/6", "key" : "detail", "value" : {"id":"6","name":"game6"}}

问题:值:可能是任何东西(文本)所以我只想存储在我的对象中{}之间出现的所有内容,这些内容在一个看似如下的对象中被反序列化:

String path;
String key;
String value;

要实现这一点,我必须转义对象(在“值”中),就像它是String一样 - 在转义之后,Gson可以为我反序列化它。

Json需要:

{"path" : "/gdi/games/2", "key" : "detail", "value" : "{\"id\":\"2\",\"\name\":\"game2\"}"}, 
{"path" : "/gdi/games/4", "key" : "detail", "value" : "{\"id\":\"4\",\"\name\":\"game4\"}"}, 
{"path" : "/gdi/games/6", "key" : "detail", "value" : "{\"id\":\"6\",\"\name\":\"game6\"}"}

3 个答案:

答案 0 :(得分:1)

这就是诀窍:

input = input.replaceAll("(?=\"[^{}]*\\})", "\\\\");

它使用了一个向前看来断言在双引号之后找到的下一个花括号是卷曲 - 意味着双引号必须是中一​​对卷曲括号中。

替换术语是字面反斜杠 - 由于双重转义需要四个反斜杠:一个用于java字符串文字,一个用于正则表达式转义。


这是使用您的示例输入的一些测试代码,产生您的预期输出:

String input = 
    "{\"path\" : \"/gdi/games/2\", \"key\" : \"detail\", \"value\" : {\"id\":\"2\",\"name\":\"game2\"}}," +
    "{\"path\" : \"/gdi/games/4\", \"key\" : \"detail\", \"value\" : {\"id\":\"4\",\"name\":\"game4\"}}," +
    "{\"path\" : \"/gdi/games/6\", \"key\" : \"detail\", \"value\" : {\"id\":\"6\",\"name\":\"game6\"}}";
input = input.replaceAll("(?=\"[^{}]*\\})", "\\\\");
System.out.println(input);

输出:

{"path" : "/gdi/games/2", "key" : "detail", "value" : {\"id\":\"2\",\"name\":\"game2\"}},
{"path" : "/gdi/games/4", "key" : "detail", "value" : {\"id\":\"4\",\"name\":\"game4\"}},
{"path" : "/gdi/games/6", "key" : "detail", "value" : {\"id\":\"6\",\"name\":\"game6\"}}

答案 1 :(得分:0)

您可以使用Jackson库将数据映射到类。 http://www.journaldev.com/2324/jackson-json-processing-api-in-java-example-tutorial

用于打印反斜杠 - 示例

  public static void main(String[] args) {
        String a="{\"id\":\"2\",\"name\":\"game2\"}";
        System.out.println("Before - "+a);
        System.out.println("After - "+a.replace("\"", "\\\""));
    }

输出 -

Before - {"id":"2","name":"game2"}
After - {\"id\":\"2\",\"name\":\"game2\"}

答案 2 :(得分:-1)

如果要添加“\”,只需添加双\ 例如:System.out.println(“\\”“); 打印此声明,您将得到:\“ 字符串abc:“\\”“;