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

标签 c# .net wpf json.net wcf-rest

我有一个正在运行的 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 上就涉及这个主题。这里有一些想法:

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

相关文章:

c# - 如何实现 "swapping"列表?

c# - 通过泛型类型参数访问属性

wpf - 渐变透明系统颜色 (WPF)

c# - C#VS2010不进入循环?

c# - 静态变量和多线程

c# - "The description for Event ID X in Source Y cannot be found."

c# - WPF 新增功能 - 更新代码中的 TextBlock 导致 NullReferenceException

c# - 为模型类c#创建元数据类和分部类有什么用

c# - 不支持 MongoDB 序列化 ()

c# - 在 dotNET C# 中使用 GZipStream 的正确方法