正确使用JavaScriptSerializer进行序列化

时间:2012-10-01 23:11:33

标签: c# jquery asp.net .net

我正在使用JavaScriptSerializer来序列化对象。在序列化异常时我遇到了麻烦。或者更确切地说,在反序列化序列化异常时,因为它包含文件路径的新行字符和反斜杠。 (让我们再挽救争议了。)

我已经做了一个“js编码”扩展方法来克服这个问题,非常类似于下面的问题:

https://stackoverflow.com/a/2680805/385926

但我知道Asp.Net WebMethods自动序列化为JSON,并且异常序列化正确,无需额外编程。

那么在串行化为JSON时asp.net如何处理这些特殊的char案例?是否有任何类别或方法来处理它?对于.Net中已经存在的东西,不是我的扩展方法和JsEncoding方法是多余的吗?

提前致谢。

修改

要求的代码。我有一个aspx页面:

protected void Page_Load(object sender, EventArgs e)
{
    Response.ContentType = "application/json";
    var serializer = new JavaScriptSerializer();

    try
    {
        // do the file manipulation and registering
        Process();

        Response.Clear();
        Response.Write(serializer.Serialize(new
        {
            d = true
        }));
    }
    catch (Exception ex)
    {   
        Response.Clear();
        Response.Write(serializer.Serialize(new
        {
            Message = ex.Message,
            ExceptionType = ex.GetType().ToString(),
            StackTrace = ex.StackTrace
        }));
    }

}

当有一些异常时,我无法使用JSON.parse进行反序列化(实际上我不确定这是在jQuery中还是在浏览器中内置)。 JSON.parse抛出异常,因为有换行符(而不是\ n字符串)和其他特殊字符。例如,它会尝试解析以下异常(并且失败):

{"Message":"User not authenticated.","ExceptionType":"System.Exception","StackTrace":" at MyWebTest.MySite.Process() in C:\Solutions\MyWebTest\MySite.aspx.cs:line 100
at MyWebTest.MySite.Page_Load(Object sender, EventArgs e) in C:\Solutions\MyWebTest\MySite\.aspx.cs:line 60"}

相反它应该返回以下内容(因为它被正确解析):

{"Message":"User not authenticated.","ExceptionType":"System.Exception","StackTrace":" at MyWebTest.MySite.Process() in C:\\\\Solutions\\\\\MyWebTest\\\\MySite.aspx.cs:line 100\\r\\n at MyWebTest.MySite.Page_Load(Object sender, EventArgs e) in C:\\\\Solutions\\\\MyWebTest\\\\MySite.aspx.cs:line 60"}

所以我创建了一个执行替换的扩展方法。代码很简单:

new
{
    Message = ex.Message.JsEncode(),
    ExceptionType = ex.GetType().ToString(),
    StackTrace = ex.StackTrace.JsEncode()
}));

1 个答案:

答案 0 :(得分:0)

我遇到了包含双引号的JSON字符串的类似问题。序列化后,我最终使用HttpUtility.JavaScriptStringEncode对其进行了正确的转义:

ApplicationDataJson =
    HttpUtility.JavaScriptStringEncode(
        new JavaScriptSerializer().Serialize(
            applicationData));

以您的原始代码

catch (Exception ex)
{   
    Response.Clear();
    Response.Write(HttpUtility.JavaScriptStringEncode(
        serializer.Serialize(new
        {
            Message = ex.Message,
            ExceptionType = ex.GetType().ToString(),
            StackTrace = ex.StackTrace
        }
    )));
}