繁体   English   中英

为什么GSON会将“ \\ n”和“ \\\\ n”都解析为换行符?

[英]Why does GSON parse both “\n” and “\\n” as newline?

我有以下代码:

public static void main(String[] args) {
    String key = "myjsonkey";
    String baseJson = "{\"" + key + "\":\"my json %svalue\"}";

    String inBackslashAndN = String.format(baseJson, "\\n");
    String inNewline = String.format(baseJson, "\n");

    String outBackslashAndN = valueFromJson(key, inBackslashAndN);
    String outNewLine = valueFromJson(key, inNewline);

    System.out.print("\nInput strings matching: ");
    System.out.println(inBackslashAndN.equals(inNewline));
    System.out.print("Output strings matching: ");
    System.out.println(outBackslashAndN.equals(outNewLine));
}

private static String valueFromJson(String key, String jsonStr) {
    System.out.println("\nINPUT: " + jsonStr);
    JsonObject json = new JsonParser().parse(jsonStr).getAsJsonObject();
    String output = json.get(key).getAsString();
    System.out.println("\nOUTPUT: " + output);
    return output;
}

输出:

INPUT: {"myjsonkey":"my json \nvalue"}

OUTPUT: my json 
value

INPUT: {"myjsonkey":"my json 
value"}

OUTPUT: my json 
value

Input strings matching: false
Output strings matching: true

我的问题是:为什么JSON会将“ \\ n”和“ \\\\ n”都解析为换行符,并且有一种方法可以在不更改原始数据的情况下强制对这两者进行不同的解析?

我正在使用gson 2.7

编辑:我知道“ \\ n”被处理为新的行控制字符,并且“ \\\\ n”是Java中字符“反斜杠”和字符“ n”的序列。 我的问题还是一样。

JSON不支持字符串中的文字换行符。 来源: http//json.org/

换行符必须表示为\\n GSON最有可能接受已经转义的斜杠+ n或文字换行符,并在JSON表示形式中标准化为斜杠+ n,当转换回字符串时,它将再次将斜杠+ n解析为文字换行符。

\\n是换行控制字符, \\\\n两个字符,反斜杠和字母n。

这两种情况都插入到JavaScript字符串“ ...”中。 因此,第二个版本将转换为换行符。 显然,对于第一种情况,字符串内的换行符是允许的。

JSON为什么将“ \\ n”和“ \\ n”都解析为换行符?

\\n被处理为实际的文字换行符(即Unicode 000A)。 \\\\n等效于JSON解析器正确解析为换行符的字符串“ \\ n”,因为“ \\ n”是JSON中的换行符。 如果需要一个实际的“ \\ n”,则可能需要\\\\\\\\n 参见JSON.org ,转义序列在“ char”下的右侧。 当您最终通过多种语言(例如Java + Regex / JSON)进行操作时,往往会产生一些令人困惑的转义序列嵌套。

从技术上讲,JSON本身也不支持字符串中的换行符。 不过,Gson会通过将其转换为“ \\ n”来为您解决这个问题:

在此处输入图片说明

有没有办法在不更改原始数据的情况下强制对这两者进行不同的解析?

我相信Gson没有提供执行此操作的方法,并且根据JSON标准,这没有多大意义。 你可以:

String unescaped = myString.replace("\\", "\\\\");

或使用正则表达式:

String unescaped = myString.replaceAll("\\\\", "\\\\\\\\");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM