Java Gson-自动报价(";)转义?

Java Gson-自动报价(";)转义?,java,json,gson,Java,Json,Gson,我在JavaEE服务器上使用GSON为视图提供一些json。 在某些对象中,我有很长的文本,可以包含任何内容(如“多么“伟大”的新闻!”) 我很惊讶,默认情况下GSON不会转义双引号,因此它不会生成有效的JSON 有什么好办法吗?也许我不理解你的问题,但我能够让GSON在不做任何设置或更改的情况下处理带引号的字符串 import com.google.gson.Gson; public class GSONTest { public String value; public

我在JavaEE服务器上使用GSON为视图提供一些json。 在某些对象中,我有很长的文本,可以包含任何内容(如“多么“伟大”的新闻!”)

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


有什么好办法吗?

也许我不理解你的问题,但我能够让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));
    }
}
输出:

String: This is a "test" of quoted strings
JSON: {"value":"This is a \"test\" of quoted strings"}

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

以下是一些GSON代码示例:

final JsonObject obj = new JsonObject();
obj.addProperty("foo", "b\"a\"r");
System.out.println(obj.toString());
输出为:

{“foo”:“b\”a\“r”}

(应该如此)


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

这就是我解决这个问题的方法

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;
    }
}
私人最终Gson mGson;
{
GsonBuilder=新的GsonBuilder();
registerTypeAdapter(String.class,新的EscapeStringSerializer());
mGson=builder.create();
}
私有静态类EscapeStringSerializer实现JsonSerializer{
@凌驾
公共JsonElement序列化(字符串s,类型类型,JsonSerializationContext JsonSerializationContext){
返回新的JsonPrimitive(escapeJS);
}
公共静态字符串转义JS(字符串){
字符串转义[][]=新字符串[][]{
{"\\", "\\\\"},
{"\"", "\\\""},
{“\n”,“\\n”},
{“\r”,“\\r”},
{“\b”,“\\b”},
{“\f”,“\\f”},
{“\t”,“\\t”}
};
for(字符串[]esc:转义){
string=string.replace(esc[0],esc[1]);
}
返回字符串;
}
}

尝试使用带有禁用HTML转义的setPrettyPrinting

import com.google.gson.Gson; 

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

转义字符有效吗?+1在一分钟前为我提供了一个几乎相同的答案:-)是的,对不起,你是对的!通过浏览器的请求(键入url),我获得了有效的JSON。但是当我使用Javascript和jQuery jsonP获取JSON时,转义符号被删除了。。。这真的很奇怪。@Stéphane Piette:您不是正在查看Javascript读入的字符串吗,即,在退出后?我想,您能够用Javascript获取对象这一事实意味着它是正确格式的JSON。您可能需要以下代码来正确处理双引号:Gson Gson=new GsonBuilder().disableHtmlEscaping().create();感谢sunghun Gson Gson=new GsonBuilder().setPrettyPrinting().disableHtmlEscaping().create();这一行解决了这个问题。我想最后一次/第五次更换是错误的。至少PostgreSQL 9.4 JSON类型不接受转义单引号。-1.对于任何大量数据,escapeJS()方法的性能都很差,因为escapeJS()必须遍历整个字符串
n
次,其中
n
是替换规则的数目。这最好用一个简单的DFA来建模,这个DFA可以遍历字符串一次,或者只使用一个库。@david.mihola别担心,我会活下来的。但感谢您告诉meGson gson=new GsonBuilder().setPrettyPrinting().disableHtmlEscaping().create();使它在我的列表类型转换器中工作。你救了我一天。谢谢。就我而言,只要
禁用htmlescaping()
就足够了