从WCF服务返回的JSON数据包含转义字符

我有一个工作的WCF – WPF应用程序工作,但我正在寻找一些优化。 下面是我的代码,其中WCF restful服务公开JSON数组,并且WPF UI正在接收它而没有任何问题。

WCF:

public clsStatus[] GetAllStatus() { DataTable dt = new DataTable(); List lstGetAllStatus = new List(); try { dt = // My Data Table foreach (DataRow dr in dt.Rows) { dcStatus objGetAllStatus = new clsStatus(); objGetAllStatus.Id = Convert.ToInt32(dr["Id"]); objGetAllStatus.Status = dr["Status"].ToString(); lstGetAllStatus.Add(objGetAllStatus); } } return lstGetAllStatus.ToArray(); } 

在WPF UI中:

 public ObservableCollection InvokeGet(string sUrl) { System.Net.WebRequest request = System.Net.HttpWebRequest.Create(sUrl); request.Method = "GET"; request.UseDefaultCredentials = true; request.ContentLength = 0; System.Net.HttpWebResponse response = request.GetResponse() as System.Net.HttpWebResponse; Stream objResponseStream = response.GetResponseStream(); StreamReader reader = new StreamReader(objResponseStream); string objResponseString = reader.ReadToEnd(); response.Close(); JavaScriptSerializer objJsonserialiser = new JavaScriptSerializer(); objJsonserialiser.MaxJsonLength = 999999999; T[] arrResult = objJsonserialiser.Deserialize(objResponseString); return new ObservableCollection(arrResult); } 

这种方式序列化/反序列化工作正常,而当我进行下面显示的更改时,反序列化不再有效:

在WCF中:

 public string[] GetAllStatus() { DataTable dt = new DataTable(); try { dt = // My Data Table string jsonresp = JsonConvert.SerializeObject(dt, Formatting.None); } return jsonresp; } 

在WPF中:

 public ObservableCollection InvokeGet(string sUrl ) { System.Net.WebRequest request = System.Net.HttpWebRequest.Create(sUrl); request.Method = "GET"; request.UseDefaultCredentials = true; request.ContentLength = 0; System.Net.HttpWebResponse response = request.GetResponse() as System.Net.HttpWebResponse; Stream objResponseStream = response.GetResponseStream(); StreamReader reader = new StreamReader(objResponseStream); string objResponseString = reader.ReadToEnd(); response.Close(); dsReportRequests dsrepreq = new dsReportRequests(); //This conversion is failing with error dsrepreq = JsonConvert.DeserializeObject(objResponseString); } 

错误: "Error converting value \"[{\"Id\":11280,\"statName}]\" to type 'clsStat[]'. Path '', line 1, position 759." "Error converting value \"[{\"Id\":11280,\"statName}]\" to type 'clsStat[]'. Path '', line 1, position 759."

我发现更改后的代码中的JSON格式包含转义字符( \ ),这似乎在反序列化时导致错误。

您的JSON正在进行双序列化。 (JSON中额外的反斜杠是对此的征兆。)

请注意,在第一个版本中,您不会调用序列化GetAllStatus()的返回对象,但是在InvokeGet()您确实会调用它来反序列化它。 这很有效。 因此,GetAllStatus的返回对象必须以某种方式自动进行序列化。 应该清楚的是,WCF必须为您处理返回对象的序列化。

在第二个版本中,您使用JsonConvert.SerializeObject()GetAllStatus()内手动序列化返回对象。 由于我们刚刚确定WCF也在进行序列化,因此您最终得到了双序列化的JSON。

要使其工作,您需要确保输出仅序列化一次。 大概你有理由在你的服务中开始使用Json.Net,所以我会寻找一种用JSON.Net替换WCF序列化器的方法。 你不必看得太远 – StackOverflow上有很多问题和答案可以解决这个问题。 这里有一些想法:

  • 用Newtonsoft Json.Net json序列化程序替换WCF内置JavascriptSerializer (概要:编写自定义消息格式化程序并配置WCF使用它)
  • 将WCF 4中的默认JSON序列化程序替换为JSON.NET (概要:手动序列化为流并完全绕过WCF的序列化)
  • 使用JSON.Net的WCF RESTful Web服务:避免双重序列化 (概要:使用Web API而不是WCF,因为它默认使用了Json.Net)