如何在ASP.NET MVC中阻止JSON序列化?

JMP*_*JMP 17 asp.net-mvc json

在开发ASP.NET MVC应用程序时,我发现了一些我的JsonResult操作引发异常的地方"序列化对象时检测到循环引用".

现在,我正在删除有问题的引用,但理想情况下我只想标记属性,使JSON序列化程序忽略它.

谁能建议我怎么做?

Mar*_*arc 28

[ScriptIgnore] 应该适合你.

  • System.Web.Script.Serialization.ScriptIgnore (4认同)
  • 其他人注意:您可能必须添加对System.Web.Extensions程序集的引用,以使其可用,至少在.NET 4中. (3认同)
  • 这应该有效,因为JsonResult在内部使用JavaScriptSerializer. (2认同)

Sim*_*ver 13

我一般发现,对于复杂的对象,最好通过创建一个临时的"inbetween"对象进行序列化:

例如,对于推荐,我会做以下事情.我实际上在我的ASPX模型页面的代码隐藏中这样做.

这会创建一个漂亮的JSON对象.您会注意到我甚至可以重构我的模型,页面仍然有效.它只是数据模型和页面之间的另一层抽象.我不认为我的控制器应该尽可能多地了解JSON,但ASPX'代码隐藏'当然可以.

/// <summary>
/// Get JSON for testimonials
/// </summary>
public string TestimonialsJSON
{
    get
    {
        return Model.Testimonials.Select(
            x => new
            {
                testimonial = x.TestimonialText,
                name = x.name
            }
            ).ToJSON();
    }
}
Run Code Online (Sandbox Code Playgroud)

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

我已经准备好反对这个建议了......把它带上......

我没有访问数据,只是重新格式化View的模型.这是'视图模型'逻辑,而不是'控制器模型'逻辑.

  • +1.起初我想提出一些反对意见"我不想创建多个模型",但你提到了"视图模型",它开始对我有所帮助:你为业务逻辑制作模型,为什么不为视图制作模型逻辑?辉煌!不是我的具体情况的答案,但def值得投票. (2认同)