System.Web.Script.Serialization.JavaScriptSerializer()。Serialize是否做了Json.Encode没有做的事情?

时间:2012-10-31 15:18:55

标签: json knockout.js asp.net-mvc-4

前言:这是以下问题的衍生问题:

  1. Best practice on passing Mvc Model to KnockoutJS
  2. How to enable data binding in KnockoutJS using the ASP.NET MVC 3 "Razor" View Engine?

  3. 当我将MVC视图模型传递给KnockoutJS时,我习惯使用following syntax

    var initialData = @Html.Raw(Json.Encode(Model));
    

    但最近,我一直看到人们使用following syntax

    var initialData = @Html.Raw( new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(Model));
    

    我的问题:

    • System.Web.Script.Serialization.JavaScriptSerializer().Serialize执行Json.Encode没有做的事情吗?

1 个答案:

答案 0 :(得分:5)

反过来说:Json.Encode(Model)比普通JavaScriptSerializer做得更多:

Json.Encode内部System.Web.Script.Serialization.JavaScriptSerializer也使用DynamicJavaScriptConverter,但会注册另一个名为DynamicJavaScriptConverter的转换器。

Json.Encode

的地方
  

知道如何从动态对象获取成员值的转换器。

您可以查看public static class Json { private static readonly JavaScriptSerializer _serializer = CreateSerializer(); public static string Encode(object value) { // Serialize our dynamic array type as an array DynamicJsonArray jsonArray = value as DynamicJsonArray; if (jsonArray != null) { return _serializer.Serialize((object[])jsonArray); } return _serializer.Serialize(value); } private static JavaScriptSerializer CreateSerializer() { JavaScriptSerializer serializer = new JavaScriptSerializer(); serializer.RegisterConverters(new[] { new DynamicJavaScriptConverter() }); return serializer; } //... } source online

Json.Encode

因此,使用dynamic可以获得处理JavaScriptSerializer个对象的额外支持,但如果您不需要它,则可以改为使用“vanilia”{{1}}。