2014-10-16 3 views
7

ich mit einem dritten Partei API kommunizierte, die JSON Antworten gibt wie folgt:Wie konvertiert man eine Zeichenkette mit entkerntem JSON sicher in gültiges JSON?

"{\"SomeResponse\":{\"FIrstAttribute\":8,\"SecondAttribute\":\"On\",\"ThirdAttribute\":{\"Id\":2,\"FirstName\":\"Okkie\",\"Name\":\"Bokkie\",\"Street\":\"\",\"StreetNumber\":null,\"PostCode\":\"\",\"City\":\"\",\"Country\":\"}}}" 

Es ist eine Art von JSON ... aber als String. Beachten Sie die ersten und letzten doppelten Anführungszeichen und natürlich alle Escape-Schrägstriche.

Derzeit löse ich dies durch String.Replacing die Backslashes und das erste und Ende Angebot. Danach kann ich es analysieren.

mystring.Replace("\\", ""); 

Was ist, wenn eines der Attribute tatsächlich einen umgekehrten Schrägstrich als Wert hat? Zum Beispiel:

In diesem Fall würde ich versehentlich den umgekehrten Schrägstrich entfernen, der dort im Wert sein sollte.

Hat jemand eine gute Idee, wie man diesen JSON String richtig parsen kann?

+3

Wie sehen Sie die Version, die Sie auf dem Laufenden? Enthält es * eigentlich * alle Backslashes, oder sehen Sie es im Debugger an? Wenn Sie es mit 'Console.WriteLine' auf der Konsole ablegen, wie sieht es aus? –

+0

Nein, es enthält wirklich alle diese Schrägstriche. Das schon überprüft. Es ist leider nicht der Debugger. – Gonzalioz

+0

Ich bekomme das auch, wenn ich eine API-Anfrage im Browser mit Chrome mache. – Gonzalioz

Antwort

11

Dies ist im Grunde JSON-codiert als ein JSON-String - nach dem Ende der Zeichenfolge sehr leicht, wie Kommentare. Es ist nicht zu hart, dass in Json.NET zu handhaben, JToken.Parse mit effektiv erster unescape, dann Parsen das Ergebnis:

using System; 
using System.IO; 
using Newtonsoft.Json.Linq; 

class Program 
{ 
    static void Main(string[] args) 
    { 
     string text = File.ReadAllText("test.json"); 
     JToken token = JToken.Parse(text); 
     JObject json = JObject.Parse((string) token); 
     Console.WriteLine(json); 
    } 
} 

Ausgang:

{ 
    "SomeResponse": { 
    "FIrstAttribute": 8, 
    "SecondAttribute": "On", 
    "ThirdAttribute": { 
     "Id": 2, 
     "FirstName": "Okkie", 
     "Name": "Bokkie", 
     "Street": "", 
     "StreetNumber": null, 
     "PostCode": "", 
     "City": "", 
     "Country": "" 
    } 
    } 
} 

Das noch in Ordnung sein sollte mit Daten Schrägstriche enthalten, da ich erwarten würde, dass die Backslashes noch einmal codiert werden - aber es wäre eine Überprüfung wert.

+0

'var text =" {\ "PersonName \": \ "Gol \\ ld \"} "' und es ist bei '' fehlgeschlagen JToken Token = JToken.Parse (Text); 'mit' Bad JSON Escape-Sequenz: \ l'. Wie hat es für Sie funktioniert? Bitte teilen. –

+3

@SriReddy: Das ist ungültig - um eine Zeichenfolge mit einem Backslash in, Sie ' d benötigt einen doppelten Backslash im JSO N, was einen * vierfachen * Backslash in Ihrem String-Literal bedeutet, z.B. 'var text =" {\ "PersonName \": \ "Gol \\\\ ld \"} "; Aber das ist nur im Literal, nicht im JSON selbst ... der JSON enthält nur einen doppelten Backslash. –

+0

@SriReddy: Es ist nicht ganz klar, ob das zweite Beispiel im Code des OPs ein realer, gültiger JSON sein soll, der als C# Quellcode geschrieben wurde - aber nicht. JSON würde nicht analysieren, aber das ist nicht die Quelldarstellung der JSON-Kodierung von Text, der einen umgekehrten Schrägstrich enthält. Jeder gültige JSON ist in Ordnung. –

1

Ugh ... das ist überhaupt kein JSON. Es ist eine seltsame JSON-ähnliche Imitation, aber eine ziemlich böse. Ich denke du machst das Richtige.

Das einzige, was ich tun könnte, ist die Operation auf Paare von Zeichen ersetzen tun und nicht nur der einzigen Flucht char:

myString.Replace(@"\""", @"""); // replace \" with "

Diese Sie sicher erlauben werden, den verschachtelten „\“ chararcters zu bewahren , so dass das gefilterte JSON wie folgt aussieht:

field_blah: "root\branch\sub-branch"

ich stark Unternehmen eine detaillierte Überprüfung des „JSON“ Text beraten und sicherzustellen, dass dies der einzige ist gepaarte Sequenz, um die Sie sich sorgen müssen. Wenn Sie andere Paarungen haben, behandeln Sie sie auf die gleiche Weise wie oben beschrieben.

1

using Newtonsoft.Json; 

    String json="{\"SomeResponse\":{\"FIrstAttribute\":8,\"SecondAttribute\":\"On\",\"ThirdAttribute\":{\"Id\":2,\"FirstName\":\"Okkie\",\"Name\":\"Bokkie\",\"Street\":\"\",\"StreetNumber\":null,\"PostCode\":\"\",\"City\":\"\",\"Country\":\"}}}";  

    dynamic result = JsonConvert.DeserializeObject(json); 

Verwandte Themen