0

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

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

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

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

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

提前致谢。

编辑:

按要求编码。我有一个 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()
}));
4

1 回答 1

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
        }
    )));
}
于 2019-03-25T12:42:54.657 回答