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