2016-04-15 12 views
0

Ich habe einen Dienst erstellt, um Datenbanksuche durchzuführen und das Ergebnis als JSON zurückzugeben, wobei Nancy verwendet wird. Hier Testcode ist:JSON-Antwort enthält zusätzliche Zeichen

using (var dt = new DataTable("MyData")) 
{ 
    dt.Columns.Add("id"); 
    dt.Columns.Add("password"); 
    dt.Columns.Add("body", System.Type.GetType("System.String")); 
    dt.Columns.Add("balance", System.Type.GetType("System.Double")); 
    dt.Rows.Add(uid, pwd, "Some useful content", 33.75); 
    dt.Rows.Add(uid, pwd, "More useful content", 128.55); 
    if (dotNetDataTable) 
     json = JsonConvert.SerializeObject(dt, new Serialization.DataTableConverter()); 
    else 
     json = JsonConvert.SerializeObject(dt); 
    json = "{\"status\":\"success\",\"data\":" + json + "}"; 
    return Response.AsJson(json); 
} 

Unterbrechung Prozess kurz vor Rückkehr, und Abfragewert von json, erhalte ich:

"{\"status\":\"success\",\"data\":[{\"id\":\"RMittelman\",\"password\":\"Password\",\"body\":\"Some useful content\",\"balance\":33.75},{\"id\":\"RMittelman\",\"password\":\"Password\",\"body\":\"More useful content\",\"balance\":128.55}]}" 

Das scheint richtig in unmittelbaren Fenstern. Wenn ich Daten empfangen und unterbrechen den Prozess, bekomme ich diese in den Client sofort Fenster:

"\"{\\\"status\\\":\\\"success\\\",\\\"data\\\":[{\\\"id\\\":\\\"RMittelman\\\",\\\"password\\\":\\\"Password\\\",\\\"body\\\":\\\"Some useful content\\\",\\\"balance\\\":33.75},{\\\"id\\\":\\\"RMittelman\\\",\\\"password\\\":\\\"Password\\\",\\\"body\\\":\\\"More useful content\\\",\\\"balance\\\":128.55}]}\"" 

die, wie Sie zusätzliche führende enthält sehen und Hinter Anführungszeichen, und eine Reihe von zusätzlichen Schrägstriche. Der JSON wird nicht deserialisiert. Hier ist das Ergebnis in Client-Textfeld angezeigt:

json result: 
"{\"status\":\"success\",\"data\": 
[{\"id\":\"RMittelman\",\"password\":\"Password\",\"body\":\"Some useful content\",\"balance\":33.75}, 
{\"id\":\"RMittelman\",\"password\":\"Password\",\"body\":\"More useful content\",\"balance\":128.55}]}" 

Unexpected JSON token when reading DataTable. Expected StartArray, got String. Path '', line 1, position 240. 

Wenn ich Vorder- und Hinter Anführungszeichen programmatisch entfernen und alle Schrägstriche, es funktioniert gut. Hier ist der Code, den ich in Client verwenden, um die Daten zu erhalten:

string GET(string url) 
{ 
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); 
    try 
    { 
     WebResponse response = request.GetResponse(); 
     using (Stream responseStream = response.GetResponseStream()) 
     { 
      StreamReader reader = new StreamReader(responseStream, Encoding.UTF8); 
      string responseText = reader.ReadToEnd(); 
      isError = false; 
      return responseText; 
     } 
    } 
    catch (WebException ex) 
    { 
     isError = true; 
     WebResponse errorResponse = ex.Response; 
     if (errorResponse == null) 
      return ex.Message; 
     using (Stream responseStream = errorResponse.GetResponseStream()) 
     { 
      StreamReader reader = new StreamReader(responseStream, Encoding.GetEncoding("utf-8")); 
      String errorText = reader.ReadToEnd(); 
      return errorText; 
     } 
     throw; 
    } 
} 

So Frage ist, warum es ok aussieht vor dem Senden, enthält aber alle Junk nach dem Senden?

+1

Sieht so aus, als ob Sie Ihre JSON-Zeichenfolge irgendwo auf dem Weg doppelt codieren. Entfernen Sie eine Ebene der JSON-Codierung. – Tomalak

+0

Das ist verwirrend für mich. Das erste unmittelbare Fensterergebnis, kurz bevor die ursprüngliche JSON-Zeichenfolge vom Dienst zurückgegeben wird, sieht korrekt aus. Ich weiß, es zeigt Anführungszeichen und Schrägstriche, aber das ist eine unmittelbare Fenster Sache, richtig? Es ist der zweite nach dem Empfang, der alle zusätzlichen Ziffern hat. Ich habe den .Net-Code nicht geschrieben, um ihn zu posten und zu erhalten, habe ihn von Google bekommen. Aber es scheint keine JSON-Codierung zu enthalten. Ich bin ratlos, um herauszufinden, warum es in Ordnung ist, bevor Antwort, aber hat zusätzlichen Müll nach dem Empfang. Gibt es vielleicht eine Art Zeichencodierung? – RMittelman

+0

Sie doppel-serialisieren Ihren JSON. (Serialisierung der Klasse zu JSON, dann Serialisierung der JSON als String-Literal.) Siehe vielleicht https://StackOverflow.com/questions/7597035/returning-a-string-containing-valid-json-with-nancy oder https://stackoverflow.com/questions/33983600/why-can-i-not-register-a-custom-json-net-implementation-in-nancy – dbc

Antwort

1

JSON wurde doppelt codiert. Code war:

json=JsonConvert.SerializeObject(dataTable); 

dann

return Response.AsJson(json); 

Changed es an:

return (Response)json; 

und das Problem ging weg. Vielen Dank für Ihre Anregungen!

Verwandte Themen