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.
* "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. –
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)' –
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? –