如何在Java中为json解析器转义字符串中的双引号

时间:2014-10-22 06:31:27

标签: java json

我收到了如下字符串:

{
    "test": [
        "",
        "abc",
        "IF(Var218 = "charlie") AND (Var85 ≤ 0) AND (Var207 = \"some value\"; \"du\") THEN Appetency = 1 ",
        "",
        """"
    ]
}

字符串将被解析为JSON对象,现在的问题是我应该如何有效地逃避Java中字符串中的一些双引号?

上面的字符串只是一个例子,请注意并非字符串中的所有双引号都应该被转义,只有双引号如“charlie”和“”“”应该被转义,否则json解析器不会解析串正确。预期结果应该是:

{
    "test": [
        "",
        "abc",
        "IF(Var218 = \"charlie\") AND (Var85 ≤ 0) AND (Var207 = \"some value\"; \"du\") THEN Appetency = 1 ",
        "",
        "\"\""
    ]
}

感谢。

4 个答案:

答案 0 :(得分:1)

我正在使用Gson库。 但看起来这就是你所要求的。

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.reflect.TypeToken;
...
public void stuff()
    {
        List<String> data = new ArrayList<String>();
        data.add("");
        data.add("abc");
        data.add("IF(Var218 = \"charlie\") AND (Var85 &le; 0) AND (Var207 = \"some value\"; \"du\") THEN Appetency = 1 ");
        data.add("\"\"");

        Gson gson = new GsonBuilder().setPrettyPrinting().disableHtmlEscaping().create();

        JsonObject test = new JsonObject();
        JsonElement jsonData = gson.toJsonTree(data, new TypeToken<List<String>>(){}.getType());
        test.add("test", jsonData);

        String json = gson.toJson(test);
        System.out.println(json);
    }

这将产生:

{
  "test":[
    "",
    "abc",
    "IF(Var218 = \"charlie\") AND (Var85 &le; 0) AND (Var207 = \"some value\"; \"du\") THEN Appetency = 1 ",
    "",
    "\"\""
  ]
}

答案 1 :(得分:1)

在java中,您可以"转义\",JSON也是如此。问题是\"不包含反斜杠,所以你也需要转义它:

String json = "hello \\\"world\\\""; // hello "world"

注意三(3)个向后斜杠。

答案 2 :(得分:0)

我不明白这一点,因为你正在逃避双引号的正确

"\"\"" // this will produce ""

在每个“放置一个\

之前这么简单

答案 3 :(得分:0)

以下算法应与input

中的JSON字符串一起使用
String progress = "";
for(int c = 0; c < input.length(); c++){
    char ch = input.charAt(c);
    if(ch == '\\'){    // Skip if the next character is already escaped
        c++;
        continue;
    }
    if(ch == '\"') progress += "\\\""; // Results in \"
    else progress += ch;    // Add the character to progress
}

转义字符串现在位于progress