Csharp/C#教程:从WCF服务返回的JSON数据包含转义字符分享


从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上有很多问题和答案可以解决这个问题。 这里有一些想法:

上述就是C#学习教程:从WCF服务返回的JSON数据包含转义字符分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/986809.html

(0)
上一篇 2021年12月22日
下一篇 2021年12月22日

精彩推荐