Asp.net mvc 如何防止ASP.NET MVC中的JSON序列化?

Asp.net mvc 如何防止ASP.NET MVC中的JSON序列化?,asp.net-mvc,json,Asp.net Mvc,Json,在开发ASP.NET MVC应用程序时,我发现我的JsonResult操作会引发异常“序列化对象时检测到循环引用” 目前,我正在删除有问题的引用,但理想情况下,我只想标记该属性,以便JSON序列化程序忽略它 有人能建议我怎么做吗?应该适合您。我通常发现,对于复杂对象,最好通过创建临时的“中间”对象进行序列化: 例如,对于推荐信,我做了以下几点。我实际上是在ASPX模型页面的代码隐藏中这样做的 这将创建一个漂亮的JSON对象。你会注意到我甚至可以重构我的模型,页面仍然可以工作。它只是数据模型和页面

在开发ASP.NET MVC应用程序时,我发现我的JsonResult操作会引发异常“序列化对象时检测到循环引用”

目前,我正在删除有问题的引用,但理想情况下,我只想标记该属性,以便JSON序列化程序忽略它


有人能建议我怎么做吗?

应该适合您。

我通常发现,对于复杂对象,最好通过创建临时的“中间”对象进行序列化:

例如,对于推荐信,我做了以下几点。我实际上是在ASPX模型页面的代码隐藏中这样做的

这将创建一个漂亮的JSON对象。你会注意到我甚至可以重构我的模型,页面仍然可以工作。它只是数据模型和页面之间的另一层抽象。我认为我的控制器不应该尽可能多地了解JSON,但ASPX的“codebehind”当然可以

/// <summary>
/// Get JSON for testimonials
/// </summary>
public string TestimonialsJSON
{
    get
    {
        return Model.Testimonials.Select(
            x => new
            {
                testimonial = x.TestimonialText,
                name = x.name
            }
            ).ToJSON();
    }
}
//
///获取用于证明的JSON
/// 
公共字符串证明
{
得到
{
return Model.commentials.Select(
x=>新的
{
证明文字,
name=x.name
}
).ToJSON();
}
}
在我的ASPX中,我只在一个块中执行此操作:

var testimonials = <%= TestimonialsJSON %>;

// oh and ToJSON() is an extension method
public static class ObjectExtensions
{
    public static string ToJSON(this Object obj)
    {
        return new JavaScriptSerializer().Serialize(obj);
    }
}
var证明=;
//oh和ToJSON()是一个扩展方法
公共静态类对象扩展
{
公共静态字符串ToJSON(此对象obj)
{
返回新的JavaScriptSerializer().Serialize(obj);
}
}
我准备好反对这个建议。。。来吧


我不是在访问数据,只是在为视图重新格式化模型。这是“视图模型”逻辑,而不是“控制器模型”逻辑。

我建议使用。它允许对循环引用进行序列化,并提供更多的序列化选项。

Simon所说的。添加一些操作以控制代码的权重。

我发现的最干净的方法是对类使用[DataContract],对要序列化的属性使用[DataMember]。DataContract属性告诉各种序列化程序忽略任何没有DataMember属性的属性

与使用ScriptIgnoreAttribute相比,有两个主要优点。首先,它不依赖于System.Web.Extensions程序集。其次,它与其他类型的序列化一起工作,而不仅仅是JSON。例如,如果您在MVC4中使用新的Web API,那么DataContract/DataMember方法也可以与XML序列化程序一起使用


考虑这样一种场景:您的实体存储在共享库中,并在不同的项目中重用—您不希望依赖System.Web.Extensions,您希望松散地描述序列化规则—而不是特定于JSON、XML等的硬代码行为。

您使用的序列化程序是什么?JsonResult是我的返回类型,因此,我假设序列化程序是ASP.NET MVC 1.0的控制器类中的默认序列化程序。它是JavaScriptSerializer。我遇到了完全相同的问题,除了在MVC2中,错误似乎是“RecursionLimit was Oversed!”。感谢Marc,[ScriptIgnore]完美地解决了这个问题。这应该可以工作,因为JsonResult在内部使用JavaScriptSerializer。请注意:您可能必须添加对System.Web.Extensions程序集的引用才能使其可用,至少在.NET 4.System.Web.Script.Serialization.ScriptIgnore+1中是这样。起初,我想提出一些反对意见:“我不想创建多个模型”,但您提到的“视图模型”对我来说开始有了一些意义:您为业务逻辑创建模型,为什么不为视图逻辑创建模型?明亮的这不是我具体情况的答案,但值得一试。我也不想创建多个模型!这是最简单的方法,无需创建另一个类(此处不需要)。模型应该是数据,而仅仅是数据,而不是数据的显示方式。虽然并不总是实用,但您应该始终最小化视图和模型之间的耦合,以防视图更改为不同的技术或需要提供多个不同的视图(ajax/flash/普通html)如果您可能需要对同一底层模型进行几个不同的JSON序列化,我喜欢这种方法。