【发布时间】:2017-06-26 16:18:11
【问题描述】:
我有以下代码:
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”的序列。我的问题还是一样。
【问题讨论】:
-
它没有。首先应用 Java 字符串文字处理,因此 JSON 解析器看到的是换行符和
\n,而不是\n和\\n。 -
\n被处理为实际的文字换行符(即 Unicode 000A)。\\n等同于字符串“\n”,JSON 解析器(正确地)将 as 解析为换行符,因为“\n”是 JSON 中的换行符。如果你想要一个实际的“\\n”,你可能需要\\\\n。请参阅JSON.org,转义序列位于“char”下方的右侧。当您最终使用多种语言(例如 Java + Regex/JSON)进行操作时,您往往会遇到一些令人困惑的转义序列嵌套。 -
我知道
\\\\n可以解决问题。我更感兴趣的是在不更改数据的情况下区分两者的解析,只需将标志或不同的读取器传递给解析器 -
@PetrosP 如果你真的想区分,你会想要求 GSON 严格遵循 JSON 标准,该标准不允许 JSON 字符串文字中的控制字符,其中case
\n将 fail 解析。 免责声明:我不知道您是否可以告诉 GSON 严格,但从技术上讲,这正是您所需要的。 -
@Andreas 我相信你可以,通过
setLenient