JavaScriptSerializer默认序列化为JSON?

时间:2011-09-15 18:08:45

标签: .net json

这不是有点奇怪吗? 看起来私有方法实际上接受允许设置JavaScript序列化模式而不是默认(JSON)的参数,但它永远不会暴露...为了使这更奇怪Serialize()愉快地接受字符串并将其编码为JavaScript字符串(它比JSON标准所要求的要安静得多,其中DateTime将被编码为JSON。

我很困惑。是否有某个派生类可以进行实际的JavaScript序列化?

2 个答案:

答案 0 :(得分:0)

我没有看到关于字符串行为的任何奇怪之处。字符串的JSON表示只是一个字符串。

在使用属性而不是简单类型序列化对象之前,您实际上看不到任何JSON表示法。

JSON是实际的javascript ,所以我不确定你正在寻找什么样的序列化。

var s = new JavaScriptSerializer();
Console.WriteLine(s.Serialize(DateTime.Now));
Console.WriteLine(s.Serialize("I like things & stuff ' \" ."));
Console.WriteLine(s.Serialize(3.14));
/* Should serialize to JSON object */
Console.WriteLine(s.Serialize(new { String = "I like things & stuff ' \" .", Date = DateTime.Now, PI = 3.14 }));
/* Should serialize to array */
Console.WriteLine(s.Serialize(new object[] { "I like things & stuff ' \" .", DateTime.Now, 3.14 }));

输出:

"\/Date(1316374642273)\/"
"I like things & stuff \u0027 \" ."
3.14
{"String":"I like things & stuff \u0027 \" .","Date":"\/Date(1316374642278)\/","PI":3.14}
["I like things & stuff \u0027 \" .","\/Date(1316374642280)\/",3.14]

有趣的日期格式有一些backstory

“Javascript”序列化格式似乎是第一次将日期序列化为JSON时遗留下来的代码。实际使用该值的唯一地方是SerializeDateTime我认为团队在根据链接文章确定这是一个坏主意之后才将这些方法设为私有:

  

我们尝试的第一件事是在JSON字符串中注入Date构造函数。出于多种原因,这是一个(非常)坏主意。首先,它根本不符合JSON规范。其次,任何在解析之前验证其输入的JSON解析器都会咳嗽这样的事情。最后,它建立了一个先例:为什么允许日期而不是任意类型?这只会破坏JSON的目的。

如果你真的只需要将一个单独的DateTime序列化为Javascript,那么你就没有理由不能窃取这几行代码,但是如果你要序列化一个复杂的对象,那么你就不应该做有正当理由这一点。

public string SerializeDateTime(DateTime datetime)
{ 
    DateTime time = new DateTime(0x7b2, 1, 1, 0, 0, 0, DateTimeKind.Utc);
    DatetimeMinTimeTicks = time.Ticks;

    var sb = new StringBuilder();
    sb.Append("new Date(");
    sb.Append((long) ((datetime.ToUniversalTime().Ticks - DatetimeMinTimeTicks) / 0x2710L));
    sb.Append(")");
    return sb.ToString();
}  

如果你需要的是在网页上实际使用ASP.NET中的序列化日期,并且你没有使用ASP.NET AJAX,那么这个问题就包含了这个问题:How do I format a Microsoft JSON date?

答案 1 :(得分:0)

序列化数据正在将其转换为字符串/流,通常可以将其存储在数据库中,或通过网络传输。 Javascript是一种编程语言。 JSON是Javascript的子集,它将对象,数组,字符串和数字表示为可以用字符串表示的文字。所有这一切都说JSON是Javascript。如果要将对象图序列化为Javascript,则 JSON。你期待什么行为?虽然JavaScriptSerializer可用于转义字符串或序列化DateTime,但我认为其目的是序列化对象图。而且,如果它确实逃避了比JSON要求更多的字符,我相信它仍然是有效的JSON。