gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 22:10:49 30 4
gpt4 key购买 nike

我有一个工作的 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 用户界面中:

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 上。这里有一些想法:

关于c# - 从 WCF 服务返回的 JSON 数据包含转义字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20606952/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com