2016-12-06 5 views
0

Ich habe viele Fragen zu diesem Problem gelesen, aber scheint nicht mein spezielles Problem zu lösen.JsonConvert.SerializeObject Escaping Backslash

Ich gebe eine JSON-Zeichenfolge von einer Web-Service-Funktion zurück.

Ich habe diese Objekte:

public class WebServiceInitResult 
{ 
    public List<Activity> Activities { get; set; } 
    //rest of properties left out... 
} 

public class Activity 
{ 
    public string IconCode { get; set; } 
    //rest of properties left out... 
} 

Die IconCode ist der Zeichencode für einen fontawesome Charakter, einer diese:

\uf0b1 
\uf274 
\uf185 
\uf0fa 
\uf0f4 
\uf015 

Sie genau in einer Datenbank gespeichert sind, wie oben gezeigt.

Wenn ich die httpReponse.Content wie unten gesetzt ist, wird der Backslash:

httpResponseMessage.Content = new StringContent(JsonConvert.SerializeObject(webServiceInitResult), Encoding.UTF8, "application/json"); 

Die json Antwort von PostMan empfangen ist:

"activities": [ 
{ 
    "ActivityCode": 2, 
    "DisplayValue": "Shopping", 
    "BackgroundColour": "E74C3C", 
    "IconCode": "\\uf0b1", 
    "ApplicationId": 2, 
    "Application": null, 
    "Id": 1, 
    "Active": true, 
    "DateCreated": "2016-11-25T10:15:40" 
}, 
//rest of activities 
] 

Wie Sie sehen können, die IconCode Backslash geschützt wurde . Wenn ich andere Fragen lese, kann ich nicht sicher entscheiden, ob dies bei Json.NET geschieht, wenn ich serialisiere oder wann die Antwort gesendet wird.

Ich versuchte, mit ObjectContent stattdessen aufzulösen, damit ich Json.NET vermeiden konnte, aber es gab dasselbe zurück!

httpResponseMessage.Content = new ObjectContent(typeof(TravelTrackerWebServiceInitResult), webServiceInitResult, new JsonMediaTypeFormatter() , "application/json"); 

Jetzt bin ich fest!

Gibt es einen besseren Weg, um genau das zurückzubringen, was ich brauche? Die Zeichen werden von einer App verwendet, um das entsprechende Symbol anzuzeigen.

Zusätzliche Informationen: Ich hatte ursprünglich diese Werte fest einprogrammiert und alles schien in Ordnung zu arbeiten:

webServiceInitResult.activities_TT = new List<Activity_TT>() 
{ 
new Activity() { ActivityCode = 2, BackgroundColour = "E74C3C", DisplayValue="Shopping", IconCode="\uf0b1" }, 
new Activity() { ActivityCode = 3, BackgroundColour = "BF7AC5", DisplayValue="Running", IconCode="\uf274" }, 
new Activity() { ActivityCode = 4, BackgroundColour = "AF7AC5", DisplayValue="Walking", IconCode="\uf185" }, 
new Activity() { ActivityCode = 5, BackgroundColour = "3498DB", DisplayValue="Jogging", IconCode="\uf0fa" }, 
new Activity() { ActivityCode = 6, BackgroundColour = "2ECC71", DisplayValue="Resting", IconCode="\uf0f4" }, 
new Activity() { ActivityCode = 7, BackgroundColour = "F39C12", DisplayValue="Skipping", IconCode="\uf015" } 
}; 

Dank.

+1

* "Der IconCode ist der Zeichencode für ein Fontawesome-Zeichen, eines davon:' \ uf0b1' '\ uf274'' \ uf185' '\ uf0fa'' \ uf0f4' '\ uf015' Sie sind in a gespeichert Datenbank genau wie oben gezeigt. "* Dann ist das das Problem. Wenn sie als die Zeichen '\', 'u',' f', '0',' b', '1' gespeichert sind, dann tut der JSON-Serializer genau das Richtige, indem er diesen Backslash entfernt. Wenn Sie möchten, dass Unicode-Escape verarbeitet wird, müssen Sie es verarbeiten, bevor Sie es Ihrer IconCode-Zeichenfolge zuweisen, sodass die Zeichenfolge tatsächlich das Zeichen und keine Zeichenfolge für das Unicode-Escape enthält. –

+0

Wie stellen Sie die 'IconCode' Variablen ein? Wenn Sie C# -Literale verwenden, erhalten Sie das tatsächliche Unicode-Zeichen, * nicht * was Sie gepostet haben. 'Debug.Assert (" \ uf0b1 ".Length == 1)' –

+0

Datenbanken haben auch keine Probleme mit Unicode, Sie könnten alles in einer 'nvarchar'-Spalte speichern. Wenn Sie die Escape-Sequenz als 6 separate Zeichen speichern, sollte * Ihr Code * das erste Zeichen sein. Warum speichern Sie den Wert nicht einfach in einer Unicode-Spalte? –

Antwort

0

Dank allen Kommentaren konnte ich das lösen.

Wie vorgeschlagen, musste ich den Zeichencode, z. "f0b1" und wandle dies vor dem Speichern in die Datenbank um. Also in meinem Activity Controller erstellen und zu bearbeiten, habe ich die im Anschluss an die info mit here:

int code = int.Parse(activity.IconCode, System.Globalization.NumberStyles.HexNumber); 
activity.Icon = char.ConvertFromUtf32(code); 

So habe ich die zusätzliche Eigenschaft Icon und den Code in ein Zeichen umgewandelt werden, die dann in der Datenbank gespeichert wird. Es ist dieses Zeichen, das in meiner JSON-Antwort zurückgegeben wird.

0

Das Problem ist, dass in C# Sprache der string Wert „\ uf0b1“ ist eigentlich ein Platzhalter für „die F0B1 Unicode-Zeichen machen“. Wenn der String vom Compiler/Runtime ausgewertet wird, wird das Unicode-Zeichen an dessen Stelle eingefügt.

Dies ist nicht das Gleiche wie das Speichern einer Zeichenfolge in einer Datenbank "\ uf0b1", die die tatsächliche Zeichenfolge und nicht das einzelne Zeichen wäre und bei Verwendung der C# -Notation "\\ uf0b1" wäre.

+0

Diese Antwort ist nicht korrekt. Das ist kein Platzhalter. Das ist * der Charakter. Diese Zeichenfolge sollte eine Länge von 1 haben. Eine Zeichenfolge, die die Zeichen '\\', 'u',' f', '0',' b' und '1' enthält, ist genau das. 6 Zeichen, von denen der erste escape sein muss –

+0

'Debug.Assert (" \ uf0b1 ".Length == 1)' –

+0

Ja, aber vom Codestandpunkt aus bedeutet es "render das Unicode-Zeichen". – toadflakz