我正在使用 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()
}));