Gson - 自动报价(")逃避?

Sté*_*tte 32 java json gson

我在我的Java EE服务器上使用GSON为视图提供了一些json.在某些对象中,我有很长的文本,可以包含任何内容(例如"真是个好消息!").

我觉得默认情况下GSON不会转义双引号,因此它不会生成有效的JSON.

有这样做的好方法吗?

Tod*_*odd 14

也许我不理解你的问题,但是我能够让GSON在没有任何设置或更改的情况下使用引号来处理字符串.

import com.google.gson.Gson;

public class GSONTest {

    public String value;

    public static void main(String[] args) {
        Gson g = new Gson();
        GSONTest gt = new GSONTest();
        gt.value = "This is a \"test\" of quoted strings";
        System.out.println("String: " + gt.value);
        System.out.println("JSON: " + g.toJson(gt));
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

String: This is a "test" of quoted strings
JSON: {"value":"This is a \"test\" of quoted strings"}
Run Code Online (Sandbox Code Playgroud)

也许我不明白你在问什么?

  • +1 提供与我一分钟前几乎相同的答案:-) (2认同)
  • @Stéphane Piette:您不是在查看 Javascript 读入的字符串,即在转义之后吗?恕我直言,您能够在 Javascript 中获取对象这一事实意味着它是正确形成的 JSON。 (2认同)
  • 您可能需要以下代码来正确处理双引号:Gson gson = new GsonBuilder()。disableHtmlEscaping()。create(); (2认同)

Sea*_*oyd 8

这是一些示例GSON代码:

final JsonObject obj = new JsonObject();
obj.addProperty("foo", "b\"a\"r");
System.out.println(obj.toString());
Run Code Online (Sandbox Code Playgroud)

输出是:

{ "foo" 的: "B \" 一个\ "R"}

(应该是)

所以你要么做错了,要么就是使用古老版本的GSON.也许您应该展示一些代码?


Amm*_*mad 8

尝试使用带有DisableHtml转义的setPrettyPrinting.

Gson gson = new GsonBuilder().setPrettyPrinting().disableHtmlEscaping().create();
 JsonParser jp = new JsonParser();
 JsonElement je = jp.parse(jsonArray.toString());
 System.out.println( gson.toJson(je));
Run Code Online (Sandbox Code Playgroud)


mc.*_*dev 7

这就是我为解决这个问题所做的

private final Gson mGson;
{
    GsonBuilder builder = new GsonBuilder();
    builder.registerTypeAdapter(String.class, new EscapeStringSerializer());
    mGson = builder.create();
}

private static class EscapeStringSerializer implements JsonSerializer<String> {
    @Override
    public JsonElement serialize(String s, Type type, JsonSerializationContext jsonSerializationContext) {
        return new JsonPrimitive(escapeJS(s));
    }

    public static String escapeJS(String string) {
        String escapes[][] = new String[][]{
                {"\\", "\\\\"},
                {"\"", "\\\""},
                {"\n", "\\n"},
                {"\r", "\\r"},
                {"\b", "\\b"},
                {"\f", "\\f"},
                {"\t", "\\t"}
        };
        for (String[] esc : escapes) {
            string = string.replace(esc[0], esc[1]);
        }
        return string;
    }
}
Run Code Online (Sandbox Code Playgroud)