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

Jim*_* G. 2 json asp.net-mvc-4 knockout.js

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

  1. 将Mvc Model传递给KnockoutJS的最佳实践
  2. 如何使用ASP.NET MVC 3"Razor"View Engine在KnockoutJS中启用数据绑定?

将MVC视图模型传递给KnockoutJS时,我习惯使用以下语法:

var initialData = @Html.Raw(Json.Encode(Model));
Run Code Online (Sandbox Code Playgroud)

但最近,我一直看到人们使用以下语法:

var initialData = @Html.Raw( new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(Model));
Run Code Online (Sandbox Code Playgroud)

我的问题:

  • 是否System.Web.Script.Serialization.JavaScriptSerializer().Serialize做一些Json.Encode不?

nem*_*esv 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;
    }

    //...
}
Run Code Online (Sandbox Code Playgroud)

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