I次のコードを持っている:なぜGSONは改行として " n"と "\ n"の両方を解析しますか?
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を" との両方を解析し、方法はあるん元のデータを変更せずにこれらの2つの異なる解析を強制するには?
私はgson 2.7
EDITを使用しています:私は「\ nは」改行制御文字に加工され、「\\ n」は文字「バックスラッシュ」と文字の列であることを承知していますJavaでは 'n'。私の質問は変わりません。
それはしません。 Javaの文字列リテラル処理が最初に適用されるので、JSONパーサーは '\ n'と' \\ n 'ではなく、改行と '\ n'を見ます。 – user2357112
'\ n'は実際のリテラル改行文字(つまりUnicode 000A)に処理されます。 '\\ n'は、JSONパーサーが(正しく)JSONの改行文字である" \ n "として改行を_as_パースする文字列" \ n "に相当します。実際の "\\ n"が必要な場合は、\\\\ nが必要な場合があります。 [JSON.org](http://www.json.org/)を参照してください。エスケープシーケンスは "char"の下にあります。いくつかの言語(Java + Regex/JSONなど)で動作すると、エスケープシーケンスが混乱することがあります。 – Moira
私は '\\\\ n 'がそのトリックをすることを理解します。私は、フラグや別のリーダーをパーサに渡すだけで、データを変更することなく2つの構文解析を区別することにもっと興味があります – PetrosP