Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么GSON同时解析这两个\";及\\";作为新线?_Java_Json_Parsing_Gson - Fatal编程技术网

Java 为什么GSON同时解析这两个\";及\\";作为新线?

Java 为什么GSON同时解析这两个\";及\\";作为新线?,java,json,parsing,gson,Java,Json,Parsing,Gson,我有以下代码: 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,

我有以下代码:

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”的顺序。我的问题仍然是一样的。

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


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

JSON不支持字符串中的文字换行符。资料来源:

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

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


\n
被处理为实际的文字换行符(即Unicode 000A)
\\n
相当于字符串“\n”,JSON解析器(正确地)将其解析为换行符,因为“\n”是JSON中的换行符。如果需要实际的“\n”,可能需要
\\\\n
。看,转义序列在右边的“char”下。当您最终通过几种语言(例如Java+Regex/JSON)进行操作时,您往往会得到一些令人困惑的转义序列嵌套

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

有没有一种方法可以在不改变原始数据的情况下强制对这两种数据进行不同的解析

我相信Gson并没有提供实现这一点的方法,而且根据JSON标准,它也没有多大意义。你可以:

String unescaped = myString.replace("\\", "\\\\");
或使用正则表达式:

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

没有。首先应用Java字符串文字处理,因此JSON解析器会看到一个换行符,
\n
,而不是
\n
\\n
\n
被处理为实际的文字换行符(即Unicode 000A)
\\n
相当于字符串“\n”,JSON解析器(正确地)将其解析为换行符,因为“\n”是JSON中的换行符。如果需要实际的“\\n”,可能需要
\\\\n
。看,转义序列在右边的“char”下。当您最终通过几种语言(例如Java+Regex/JSON)进行操作时,您往往会得到一些令人困惑的转义序列嵌套。我知道
\\\\n
可以做到这一点。我更感兴趣的是在不改变数据的情况下区分这两者的解析,只需将标志或不同的读取器传递给parser@PetrosP如果您真的想要区分,您应该要求GSON严格遵守JSON标准,该标准禁止JSON字符串文本中的控制字符,在这种情况下,
\n
将无法解析。免责声明:我不知道您是否可以告诉GSON要严格,但从技术上讲,这是您需要的。@Andreas我相信您可以,通过
setLenient