2017-06-26 16 views
1

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'。私の質問は変わりません。

+3

それはしません。 Javaの文字列リテラル処理が最初に適用されるので、JSONパーサーは '\ n'と' \\ n 'ではなく、改行と '\ n'を見ます。 – user2357112

+2

'\ n'は実際のリテラル改行文字(つまりUnicode 000A)に処理されます。 '\\ n'は、JSONパーサーが(正しく)JSONの改行文字である" \ n "として改行を_as_パースする文字列" \ n "に相当します。実際の "\\ n"が必要な場合は、\\\\ nが必要な場合があります。 [JSON.org](http://www.json.org/)を参照してください。エスケープシーケンスは "char"の下にあります。いくつかの言語(Java + Regex/JSONなど)で動作すると、エスケープシーケンスが混乱することがあります。 – Moira

+0

私は '\\\\ n 'がそのトリックをすることを理解します。私は、フラグや別のリーダーをパーサに渡すだけで、データを変更することなく2つの構文解析を区別することにもっと興味があります – PetrosP

答えて

0

\nは改行制御文字、\\nは2文字、バックスラッシュおよび文字nです。

これらの両方の場合は、JavaScript文字列 "..."に挿入されます。したがって、2番目のバージョンは改行に変換されます。そして、明らかに、最初のケースでは、文字列内の改行文字が許されます。

2

JSONは文字列内のリテラル改行をサポートしていません。出典:http://json.org/

改行は\nとする必要があります。 GSONは、すでにエスケープされたスラッシュ+ nまたはリテラル改行を受け入れ、JSON表現内でスラッシュ+ nに正規化します。これは、文字列に変換してスラッシュ+ nをリテラル改行に再度解析します。

0

なぜJSONは改行として「\ n」と「\ n」の両方を解析しますか?

は実際のリテラル改行文字(つまりUnicode 000A)に処理されます。 \\nは、JSONパーサー(正しく)が改行文字として解析する文字列 "\ n"に相当します。 "\ n"はJSONの改行文字です。実際の "\ n"が必要な場合は、\\\\nが必要な場合があります。 JSON.orgを参照してください。エスケープシーケンスは右側の「char」の下にあります。いくつかの言語(Java + Regex/JSONなど)で動作すると、エスケープシーケンスが混乱することがあります。

JSON自体も技術的に文字列の改行をサポートしていません。 Gsonは「\ nを」に変換することにより、しかし、あなたのためにこれの世話をする:

enter image description here

元のデータを変更することなく、これらの二つの異なる解析を強制する方法はありますか?

私はGsonがこれを行う手段を提供していないと考えています.JSON標準によればそれほど意味をなさないでしょう。あなたは可能性:

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

や正規表現で:

String unescaped = myString.replaceAll("\\\\", "\\\\\\\\"); 
関連する問題