在视图中将.Net对象转换为JSON对象

时间:2011-12-14 09:30:49

标签: javascript jquery json asp.net-mvc-3

我想在视图中将.Net对象转换为JSON。我的视图模型是这样的,

public class ViewModel{
    public SearchResult SearchResult { get; set;}    
}    

public class SearchResult {
    public int Id { get; set; }
    public string Text{ get; set; }
}

我想将Model.SearchResult转换为JSON对象。现在,我这样做:

System.Web.Script.Serialization.JavaScriptSerializer serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
//....
var s = @serializer.Serialize(Model.Institution);

但结果是这样的,

var s = { "Name":"a","Id":1};
Create:228Uncaught SyntaxError: Unexpected token &

如何将此正确转换为JSON对象?

3 个答案:

答案 0 :(得分:65)

尝试使用此方法:

@Html.Raw(Json.Encode(Model.Content))

答案 1 :(得分:35)

我从asp.net mvc 2开始使用这个助手

public static MvcHtmlString ToJson(this HtmlHelper html, object obj)
{
  JavaScriptSerializer serializer = new JavaScriptSerializer();
  return MvcHtmlString.Create(serializer.Serialize(obj));
}

public static MvcHtmlString ToJson(this HtmlHelper html, object obj, int recursionDepth)
{
  JavaScriptSerializer serializer = new JavaScriptSerializer();
  serializer.RecursionLimit = recursionDepth;
  return MvcHtmlString.Create(serializer.Serialize(obj));
}

在视图中:

  <script>
    var s = @(Html.ToJson(Model.Content));
  </script>

我现在应该用JSON.Encode(..)替换序列化程序,就像在Hemant的引用中提到的那样。 (它使用自己的JavaScriptSerializer)。

问题的根源是“@”,HTML编码JSON。您可以使用@ Html.Raw(..)来避免此行为。

+:看看Json.Net http://json.codeplex.com/

JSON.Net更新

我刚刚用JSON.net更新了助手(好多了)。

似乎有些用户继续阅读,upvote并使用旧代码。我希望他们使用更好的方式,使用下面的新版本,或使用像NGon这样的Matthew Nichols注释中注意到它。

以下是代码:

using System;
using Newtonsoft.Json;

namespace System.Web.Mvc
{
  public static class HtmlHelperExtensions
  {
    private static readonly JsonSerializerSettings settings;

    static HtmlHelperExtensions()
    {
      settings = new JsonSerializerSettings();
      // CamelCase: "MyProperty" will become "myProperty"
      settings.ContractResolver = new Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver();
    }

    public static MvcHtmlString ToJson(this HtmlHelper html, object value)
    {
      return MvcHtmlString.Create(JsonConvert.SerializeObject(value, Formatting.None, settings));
    }
  }
}

答案 2 :(得分:1)

这是我原来答案的更新,我承认,由于@Tyrsius坚持不懈:D拒绝放弃我无法访问<script>标签中创建的变量的事实在我的.js库的单独文件的MVC 5 cshtml页面中,我发现如果我将脚本标签放在@section脚本语句块中,那里创建的vars确实构成了全局范围,并且可用于我的插件小部件。我还没有在任何更复杂的应用程序中使用它,但确实在另一个应用程序的protoType中使用它,答案如下。现在@ Html.Raw(...)工作,我能够序列化一个我可以立即使用的对象。

这是我将从现在开始使用的东西......再次感谢我和@Tyrsius挂在那里

   @section scripts
    {
    <script type="text/javascript">
        @using MRTCProtoType.Models.ControllerData.Contracts

        var testVar = @Html.Raw(JsonConvert.SerializeObject(WMMWorkloadTestData.getWorkloadTestData()));
    </script>
        @Scripts.Render("~/bundles/homeworkflow")
    }

以下代码位于单独的.js文件中

$(document).ready(function() {  
    alert(JSON.stringify(testVar));
});