Java “逃避”;在字符串之间

Java “逃避”;在字符串之间,java,regex,replace,escaping,Java,Regex,Replace,Escaping,我得到一个Json,然后使用Gson在一个对象中反序列化它,其中值是字符串而不是对象。。所以我试图将该对象放入一个字符串变量中,而不是反序列化 我想这样做: result = result.replace("\"value\" : {", "\"value\" : \"{"); result = result.replace("}}", "}\"}"); {value:{id:“2”}->{value:{\“id\”:\“2”} 我将的“value”:{替换为的“value”:“{如下所示:

我得到一个Json,然后使用Gson在一个对象中反序列化它,其中值是字符串而不是对象。。所以我试图将该对象放入一个字符串变量中,而不是反序列化

我想这样做:

result = result.replace("\"value\" : {", "\"value\" : \"{");
result = result.replace("}}", "}\"}");
{value:{id:“2”}
->
{value:{\“id\”:\“2”}

我将
的“value”:{
替换为
的“value”:“{
如下所示:

result = result.replace("\"value\" : {", "\"value\" : \"{");
result = result.replace("}}", "}\"}");
然后我把}替换成这样:

result = result.replace("\"value\" : {", "\"value\" : \"{");
result = result.replace("}}", "}\"}");
我的结果是(在更换所有部件后):

现在唯一的问题是:我还想用
\“
替换
,但只在
“{
}”
内部,我想不出来

编辑:

传入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"}}
问题:value:可以是任何内容(文本),因此我只想在对象中存储{}之间的所有内容,这些内容在对象中反序列化,如下所示:

String path;
String key;
String value;
要实现这一点,我必须像字符串一样转义对象(在“value”中),转义后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\"}"}

如果要添加“\”,只需添加double\即可 例如:System.out.println(“\\”); 打印此对账单,您将得到:\“
字符串abc:“\\”

您可以使用
Jackson
库将数据映射到类。

用于打印反斜杠-示例

  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\"}
这就是诀窍:

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\"}}

听起来您应该从使用JSON API开始,而不是尝试通过字符串操作来操作JSON之类的东西。这里的背景是什么?你在哪里做的?在JSP中?你在使用Struts吗?我得到一个Json,然后使用Gson在一个对象中序列化它,其中值是字符串而不是对象。。因此,我试图将该对象放入一个字符串变量中,而不是序列化为context@JonSkeeti。我不确定您在这里试图实现什么,但我87%确信您可以用更好的方式实现。我建议使用stack来回答您的问题。有一个已知的计算开括号的算法,你应该使用它,这不是问题所在。“只在{..}”是一个更具体的问题,只在:“\”值\“:{”@KaranDani你可能想看看格式指南:那很好,我知道如何用\”替换“但是我的问题是,我只想在“值”:{…}之间进行替换。这真的很管用。谢谢!这样使用:result=result.replace(“\”值\“:{”,value\:\“{”);result=result.replaceAll((?=\“[^{}]*\\})”,“\\\”;result=result.replace(“}}}”,“}\”);来获取我所需的Json!谢谢!不用担心。使用正确的正则表达式可以做的事情真是太棒了!