我有一个正在运行的 WCF - WPF 应用程序,但我正在寻找一些优化。 下面是我的代码,其中 WCF Restful 服务公开 JSON 数组,并且 WPF UI 毫无问题地接收它。
WCF:
public clsStatus[] GetAllStatus()
{
DataTable dt = new DataTable();
List<clsStatus> lstGetAllStatus = new List<clsStatus>();
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<T> InvokeGet<T>(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<T[]>(objResponseString);
return new ObservableCollection<T>(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<T> InvokeGet<T>(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<dsReportRequests>(objResponseString);
}
错误:“将值\”[{\"Id\":11280,\"statName}]\"转换为类型“clsStat[]”时出错。路径 '',第 1 行,位置 759。”
我发现更改后的代码中的 JSON 格式包含转义字符 (\
),这似乎是在反序列化时导致错误。
最佳答案
您的 JSON 正在被双重序列化。 (JSON 中额外的反斜杠就是这种情况的症状。)
请注意,在第一个版本中,您没有在 GetAllStatus()
中调用来序列化返回对象,但在 InvokeGet()
中,您确实调用了反序列化它。那行得通。因此,以某种方式,来自 GetAllStatus 的返回对象必须自动序列化。应该清楚的是,WCF 必须为您处理返回对象的序列化。
在第二个版本中,您可以使用 JsonConvert.SerializeObject()
在 GetAllStatus()
内手动序列化返回对象。由于我们刚刚确定 WCF 也在进行序列化,因此您最终会得到双序列化的 JSON。
要使其正常工作,您需要确保输出仅序列化一次。想必您有理由开始在服务中使用 Json.Net,因此我会寻找一种用 JSON.Net 替换 WCF 序列化器的方法。你不必看得太远——有quite a few questions and answers StackOverflow 上就涉及这个主题。这里有一些想法:
- replace WCF built-in JavascriptSerializer with Newtonsoft Json.Net json serializer (概要:编写自定义消息格式化程序并配置 WCF 来使用它)
- Replace default JSON serializer in WCF 4 to JSON.NET (概要:手动序列化到流并完全绕过 WCF 的序列化)
- WCF RESTful web service with JSON.Net: avoid double serialization (概要:使用 Web API 而不是 WCF,因为它默认已使用 Json.Net)
关于c# - 从 WCF 服务返回的 JSON 数据包含转义字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20606952/