2016-05-14 12 views
-1

Ich versuche, json Zeichenfolge zu JsonObject zu analysieren, aber ich habe eine Ausnahme ("Bad JSON Escape-Sequenz: \ x. Pfad 'original_query', Zeile 8, Position 35.")Json zu JsonObject mit Newtonsoft zu analysieren

Ich weiß, dass es in meinem JSON String schlechte Zeichen gibt, aber ich kann diese Zeichen nicht umgehen.

Hier ist mein Arbeits:

String json = File.ReadAllText("json.txt"); 

JObject json = JObject.Parse(json); 

Hier sind JSON-Datei Daten:

{ 
"original_query" : "[currency == \x22USD\x22 \x26 ((exchange == \x22NASDAQ\x22) | (exchange == \x22NYSE\x22) | (exchange == \x22NYSEARCA\x22) | (exchange == \x22NYSEMKT\x22) | (exchange == \x22OTCBB\x22) | (exchange == \x22OTCMKTS\x22)) \x26 (forward_pe_1year \x3E= 0.00) \x26 (forward_pe_1year \x3C= 9.73)]", 
"query_for_display" : "[currency == "USD" & ((exchange == "NASDAQ") | (exchange == "NYSE") | (exchange == "NYSEARCA") | (exchange == "NYSEMKT") | (exchange == "OTCBB") | (exchange == "OTCMKTS")) & (forward_pe_1year >= 0.00) & (forward_pe_1year <= 9.73)]" 
} 

Ich versuche zu ersetzen, dass Zeichen:

//json = json.Replace("\x22", "\""); 
//json = json.Replace("\x26", " "); 
//json = json.Replace("\x3E", ">"); 
//json = json.Replace("\x3C", "<"); 

Aber es mir auch gleiche Ausnahme geben .

+0

Meinst du '" \\ x22 "' ...? Respectifly '@" \ x22 "' – Matthias

+5

Dieser Code würde nicht kompilieren. Bitte geben Sie ein Beispiel an, das tatsächlich kompiliert werden würde, damit wir sagen können, was Ihr JSON wirklich ist. Wenn Sie es von einer Datei bekommen und was Sie gezeigt haben, ist wirklich der Inhalt der Datei, bitte sagen Sie so, dass wir das Problem reproduzieren können. Womit wird der ungültige JSON erzeugt? –

+0

Eigentlich kommt dieser JSON von api. – Saadi

Antwort

1

Ihr Ersetzungsversuch ist fehlgeschlagen, weil Sie ein C# -Zeichenfolgenliteral verwendet haben, wobei \x eine C# -Ecapesequenz ist. Sie konnte verwendet haben so etwas wie:

json = json.Replace("\\x22", "\\\""); 

... die \x22 mit \" im Text ersetzen würde.

Es sieht jedoch so aus, als ob der Text, den Sie erhalten, tatsächlich viele \x Escape-Sequenzen enthält, also würde ich sie nicht einfach nacheinander ersetzen, sondern in einem Schritt. Hier ist ein kurzes aber vollständiges Programm, das mit dem Link funktioniert, den Sie im Chat zur Verfügung gestellt haben:

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

class Test 
{ 
    static void Main() 
    { 
     string text = File.ReadAllText("f.txt"); 
     text = Regex.Replace(text, @"\\x[0-9a-fA-Z]{2}", ConvertHexEscape); 
     JObject obj = JObject.Parse(text); 
     Console.WriteLine(obj); 
    } 

    static string ConvertHexEscape(Match match) 
    { 
     string hex = match.Value.Substring(2); 
     char c = (char) Convert.ToInt32(hex, 16); 
     // Now we know the character we're trying to represent, 
     // escape it if necessary. 
     switch (c) 
     { 
      case '\\': return @"\\"; 
      case '"': return "\\\""; 
      default: return c.ToString(); 
     } 
    } 
} 
+0

Ich weiß, \ x22 ist Zitat, aber ich bin nicht in der Lage, es auch zu ersetzen: json = json.Replace ("\ x22", "\" "); – Saadi

+0

@Saadi: Du bist, aber du bist Ersetzen eines doppelten Zitats durch ein Doppelzitat - es ist wie "json = json.Replace (" a "," a ") sagen;." Was für einen Effekt erwartest du zu haben? Ich glaube nicht, dass du es vollständig gelesen hast verstand den zweiten Teil meiner Antwort. –

+0

Ja, ich verstehe es jetzt. Danke! Also gibt es keine Lösung, den JSON zu analysieren, stattdessen muss ich JSON-Zeichenfolge ändern? – Saadi