我想在视图中将.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对象?
答案 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));
});