【问题标题】:Does System.Web.Script.Serialization.JavaScriptSerializer().Serialize do something that Json.Encode doesn't?System.Web.Script.Serialization.JavaScriptSerializer().Serialize 做 Json.Encode 没有做的事情吗?
【发布时间】:2012-10-21 02:31:06
【问题描述】:

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

  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?

在将我的 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 不会做的事情吗?

【问题讨论】:

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


    【解决方案1】:

    情况正好相反:Json.Encode(Model) 比普通的JavaScriptSerializer 做得更多:

    在内部Json.Encode 也使用System.Web.Script.Serialization.JavaScriptSerializer,但它注册了一个名为DynamicJavaScriptConverter 的附加转换器。

    DynamicJavaScriptConverter 是一个

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

    您可以查看Json.Encodesource online

    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;
        }
    
        //...
    }
    

    因此,使用 Json.Encode 您可以获得处理 dynamic 对象的一些额外支持,但如果您不需要它,您可以改用“vanilia”JavaScriptSerializer

    【讨论】:

      猜你喜欢
      • 2016-07-31
      • 2011-09-28
      • 2020-07-05
      • 1970-01-01
      • 1970-01-01
      • 2021-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多