2014-10-16 28 views
7

sto comunicando con un terzo API parti che restituisce le risposte JSON come segue:Come convertire in sicurezza una stringa contenente JSON con caratteri escape in JSON valido?

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

E 'sorta di JSON ... ma come una stringa. Notare le citazioni doppie di prima e di fine e, naturalmente, tutte le barre di escape.

Attualmente risolvo questo problema con String.Riplaccando le barre inverse e la prima e ultima quota. Dopo ciò, sono in grado di analizzarlo.

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

Tuttavia, cosa succede se uno degli attributi ha in realtà una barra rovesciata come un valore? Per esempio:

\"SecondAttribute\":\"My Super Back Slash: \\ . That was it.\" 

In tal caso, vorrei rimuovere accidentalmente il backslash che dovrebbe essere lì nel valore.

Qualcuno ha un'idea brillante su come analizzare correttamente questa stringa JSON?

+3

Come stai vedendo la versione che hai postato? In realtà * contiene * tutti quei backslash o lo stai guardando nel debugger? Se lo si salva nella console con 'Console.WriteLine', che aspetto ha? –

+0

No, contiene davvero tutte queste barre. Controllato che già. Non è il debugger tristemente. – Gonzalioz

+0

Ottengo questo anche quando si effettua una richiesta API nel browser utilizzando Chrome. – Gonzalioz

risposta

11

Questo è fondamentalmente codificato JSON come una stringa JSON - dopo aver medicato la fine della stringa molto leggermente, come da commenti. Non è troppo difficile da gestire che nel Json.NET, utilizzando JToken.Parse efficacemente Unescape prima, poi l'analisi del risultato:

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); 
    } 
} 

uscita:

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

Questo dovrebbe andare bene anche con i dati che contiene barre rovesciate, come mi aspetterei che i backslash siano codificati ancora una volta - ma varrebbe la pena ricontrollarlo.

+0

'var text =" {\ "PersonName \": \ "Gol \\ ld \"} "' e ha fallito proprio a ' Token JToken = JToken.Parse (testo); 'con' Sequenza di escape Bad JSON: \ l'. Come ha funzionato per te? Si prega di condividere. –

+3

@SriReddy: Non è valido - per creare una stringa con una barra rovesciata in, si ' d bisogno di un doppio backslash nel JSO N, che significa una barra rovesciata * quadrupla * nella stringa letterale, ad es. 'var text =" {\ "PersonName \": \ "Gol \\\\ ld \"} ";' Ma questo è solo nel letterale, non nello stesso JSON ... il JSON contiene solo un doppio backslash. –

+0

@SriReddy: Non è del tutto chiaro se il secondo esempio nel codice dell'OP è pensato per essere JSON reale, valido, scritto come codice sorgente C#, ma non lo è. Quel JSON non analizzerebbe, ma quella non è la rappresentazione sorgente della codifica JSON del testo che contiene una barra rovesciata. Qualsiasi JSON valido va bene. –

1

Ugh ... non è affatto JSON. È una strana imitazione simile a quella di JSON, ma piuttosto bella. Penso che tu stia facendo la cosa giusta.

L'unica cosa che potrei fare è fare l'operazione di sostituzione su coppie di personaggi piuttosto che solo il singolo fuga char:

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

questo vi permetterà di conservare in modo sicuro le nidificati "\" chararcters , in modo che il JSON filtrata assomiglia:

field_blah: "root\branch\sub-branch"

Vi consiglio vivamente di intraprendere una revisione dettagliata del testo "JSON" e garantire che questo è l'unico sequenza accoppiata di cui devi preoccuparti. Se hai altri abbinamenti, gestiscili nello stesso modo descritto sopra.

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); 

Problemi correlati