2016-05-22 11 views
1

Ich erwarte Klasseninstanz als eine Antwort von meinem Ruhe-Endpunkt. Hier ist meine Beispielklasse:ASP.NET Web API-Serialisierungsobjekt mit n Symbol

public class Sample 
{ 
    public string SomeThing {get;set;} 
} 

und SomeThing Feld enthalten neben string = "SomeText \n MoreText"

aber wenn ich, dass Endpunkt als Ergebnis nenne ich nächste erhalten:

{SomeThing:"SomeText \\n MoreText"} 

Ich verstehe, dass WebAPI ist automatisches Speichern vor möglicher Injektion. Aber ich möchte das Screening von \n Symbol verhindern. Wie es richtig gemacht wird?

+0

Wie wäre es mit dem Ersetzen aller '\\ n' auf' \ n' im Ergebnis? –

+0

Mein Objekt ist komplexer, als ich erwähnt habe, und ich glaube, dass es einen besseren Ansatz mit Serializer-Einstellungen gibt. – Maris

Antwort

1

Sie müssen das "\" in Ihrem String (es in ein Doppel - "\") zu entkommen, sonst wird es ein Newline in der JSON-Quelle, nicht die JSON-Daten.

Von IETF:

alle Unicode-Zeichen können in den Anführungszeichen außer für die Zeichen gesetzt werden, die maskiert werden müssen: Anführungszeichen, Solidus umkehren, und die Steuerzeichen (U + 0000 bis U + 001F).

Da ein Zeilenumbruch ein Steuerzeichen ist, muss es maskiert werden.

1

Dies hat nichts damit zu tun, dass "Sie vor der Injektion geschützt wird", da nur so wie JSON serialisiert/deserialisiert werden soll.

Dies sind die Schritte beschreibt, warum das, was Sie sehen, das richtige Verhalten ist:

1. Rufen Sie mit C# Variable Sie diese haben:

"SomeText \n MoreText" 

2. Wenn Sie Ihr Objekt serialisiert wird, Sie‘ ll müssen diese (dies ist nur ein C# Zeichenfolge ist, die die Anführungszeichen und die Backslash):

"{\"SomeThing\":\"SomeText \\n MoreText\"}" 

3. Sobald die JSON an den Client gesendet werden (ein Browser zum Beispiel) es so aussehen werde:

// Notice the C# backslash and quotes escaping is no longer there 
{"SomeThing":"SomeText \n MoreText"} 

4. Sobald Ihr JSON deserialisiert wird (zum Beispiel unter Verwendung von JavaScript JSON.parse) Ihr Objekt wird wie folgt aussehen:

var myobject = { 
    SomeThing:"SomeText \n MoreText" 
} 

Die \n ist da, weil im ersten Schritt Sie sagten, Sie wollten Eine Zeile wird dort unterbrochen, wenn Sie den Wert von Something ausgeben, wird das \ n als Zeilenumbruch gelesen.Wenn Sie zum Beispiel Something in Ihrem Browser Konsole aus sehen Sie das:

>> console.log(myobject.Something) 

SomeText 
MoreText 

Nun, wenn Sie die die \\n nach Schritt entfernt hatte 2 dann den Druck der json in Schritt 3 Sie sich mit dieser beendet hätte:

{"SomeThing":"SomeText n MoreText"} 

und im Schritt 4:

var myobject = { 
    SomeThing:"SomeText n MoreText" 
} 

und beim Drucken des Inhalts von myobject.SomeThing in dieser Folge hätte:

>> console.log(myobject.Something) 

SomeText n MoreText