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

Jay*_*ena 33 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; }
}
Run Code Online (Sandbox Code Playgroud)

我想转换Model.SearchResult为JSON对象.我正在这样做:

System.Web.Script.Serialization.JavaScriptSerializer serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
//....
var s = @serializer.Serialize(Model.Institution);
Run Code Online (Sandbox Code Playgroud)

但结果是这样的,

var s = { "Name":"a","Id":1};
Create:228Uncaught SyntaxError: Unexpected token &
Run Code Online (Sandbox Code Playgroud)

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

Kye*_*ica 65

尝试使用此方法:

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


小智 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));
}
Run Code Online (Sandbox Code Playgroud)

在视图中:

  <script>
    var s = @(Html.ToJson(Model.Content));
  </script>
Run Code Online (Sandbox Code Playgroud)

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

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

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

JSON.Net更新

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

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

这是代码:

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));
    }
  }
}
Run Code Online (Sandbox Code Playgroud)