2016-04-15 138 views
0

我创建了一个服务来执行数据库查找并使用Nancy将结果返回为JSON。下面是测试代码:JSON响应包含额外字符

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代码发布和接收,从谷歌。但它似乎没有包含任何JSON编码。我不知道为什么它在返回响应之前看起来没问题,但是在收到后有额外的垃圾。有可能是某种字符编码的事情吗? – RMittelman

+0

您正在对您的JSON进行双重序列化。 (将该类序列化为JSON,然后将JSON作为字符串文本序列化。)请参阅https://stackoverflow.com/questions/7597035/returning-a-string-containing-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; 

和问题走了。谢谢大家的意见!