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

时间:2013-12-16 09:07:40

标签: 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);
}

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

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

1 个答案:

答案 0 :(得分:2)

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

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

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

要使其工作,您需要确保输出仅序列化一次。大概你有理由在你的服务中开始使用Json.Net,所以我想找到一种用JSON.Net替换WCF序列化器的方法。你不必看得太远 - StackOverflow上有quite a few questions and answers来处理这个话题。以下是一些想法: