【问题标题】:Convert .Net object to JSON object in the view在视图中将 .Net 对象转换为 JSON 对象
【发布时间】:2011-12-14 09:30:49
【问题描述】:

我想在视图中将 .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 对象?

【问题讨论】:

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


【解决方案1】:

试试这个方法:

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

【讨论】:

  • 有什么方法可以将默认的 Json.Encode 序列化器更改为 JSON.NET?
  • 如果你用谷歌搜索.net default json serializer,你会发现大量的链接可以做到这一点。
  • 这是最好的答案。如果实际的字符串是以 JSON 开头的,那就更简单了:)
  • 对于那些想知道的人,Json.Encode 位于System.Web.Helpers
  • @Tyrsius,这些结果并没有告诉您如何更改 Json.Encode 以使用 JSON.NET 序列化程序。
【解决方案2】:

我从 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 更新了帮助程序(好多了)。

似乎有些用户继续阅读、支持和使用旧代码。我希望他们使用更好的方法,使用下面的新版本,或者使用 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));
    }
  }
}

【讨论】:

  • 我通常会为这类事情设置 NGon (github.com/brooklynDev/NGon),但如果我只是在一个地方使用,这是一个不错的解决方案。
【解决方案3】:

这是对我原始答案的更新,我承认由于@Tyrsius 的坚持纠缠:D 他拒绝放弃我无法访问在我的&lt;script&gt; 标签中创建的变量这一事实我的 .js 库中的 MVC 5 cshtml 页面位于单独的文件中,我发现如果我将脚本标记放在 @section 脚本语句块中,在那里创建的 var 确实会产生全局范围并且可用于我的插件小部件。到目前为止,我还没有在任何更复杂的应用程序中使用它,但确实在另一个应用程序的 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));
});

【讨论】:

  • 这是一个有趣的“陷阱”,我以前没有遇到过,谢谢你把它包括在内 =)
  • 感谢您的推动...它让我努力寻找更好的解决方案...请注意我给您的轻微信任,哈哈...
猜你喜欢
  • 2014-03-07
  • 2022-01-25
  • 1970-01-01
  • 2010-12-07
  • 2017-06-16
  • 2016-04-24
  • 1970-01-01
  • 1970-01-01
  • 2020-07-23
相关资源
最近更新 更多