2016-04-15 7 views
0

Я создал службу для поиска базы данных и возврата результата в виде JSON, используя Nancy. Вот тестовый код:JSON Response содержит дополнительные символы

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

процесс перебивает как раз перед возвращением, и значение анкетирования JSON, я получаю:

"{\"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}]}" 

Это кажется правильным в немедленном окне. Когда я получаю данные, и прервать процесс, я получаю это в ближайшем окне клиента:

"\"{\\\"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}]}\"" 

Который, как вы можете видеть, содержит дополнительные ведущие и ведомые котировки, и кучу дополнительных обратных косых черт. JSON не будет десериализоваться. Вот результат, показанный в текстовом поле клиента:

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. 

Если программно удалить ведущие и завершающие кавычки и все обратные косые черты, он отлично работает. Вот код, который я использую в клиенте, чтобы получить данные:

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

Так вопрос, почему она выглядит хорошо перед отправкой, но содержит все барахло после отправки?

+1

Похоже, вы дважды кодируете строку JSON где-то по пути. Удалите один уровень кодировки JSON. – Tomalak

+0

Это меня смущает. Результат первого немедленного окна, непосредственно перед возвратом исходной строки JSON из службы, выглядит правильно. Я знаю, что это показывает кавычки и косые черты, но это немедленное окно, верно? Это второй, после получения, который имеет все дополнительные цифры. Я не писал код .Net для публикации и получения, отключил его от Google. Но, похоже, он не содержит кодировки JSON. Я не понимаю, почему он выглядит нормально, прежде чем возвращать ответ, но после получения лишнего мусора. Может быть, существует какая-то кодировка символов? – RMittelman

+0

Вы дважды сериализуете свой JSON. (Сериализация класса в JSON, а затем сериализация JSON в виде строкового литерала.) См., Возможно, https://stackoverflow.com/questions/7597035/returning-a-string-contain-valid-json-with-nancy или https://stackoverflow.com/questions/33983600/why-can-i-not-register-a-custom-json-net-implementation-in-nancy – dbc

ответ

1

JSON получил двойное кодирование. Код был:

json=JsonConvert.SerializeObject(dataTable); 

затем

return Response.AsJson(json); 

изменил его:

return (Response)json; 

и проблема ушла. Спасибо всем за ваш вклад!

Смежные вопросы