在 .NET JSON 序列化期间忽略字段;类似于 [XmlIgnore]?

Posted

技术标签:

【中文标题】在 .NET JSON 序列化期间忽略字段;类似于 [XmlIgnore]?【英文标题】:Ignoring a field during .NET JSON serialization; similar to [XmlIgnore]? 【发布时间】:2010-11-27 13:10:51 【问题描述】:

我有一个 POCO 类,它作为 .NET 3.5 sp1 中的 JSON 字符串发送到浏览器。我只是使用默认的 JSON 序列化,并且有一些我想忽略的字段。我想在它们上面放一个类似于 [System.Xml.Serialization.XmlIgnore] 的属性,这样它们就不会被序列化了。

【问题讨论】:

【参考方案1】:
[ScriptIgnore] 

是你的哈卡莓。

【讨论】:

它实际上是“Huckle Bearer”,但我会给你一个 +1 的努力和电影。 :) 原来的答案是正确的,他说的是“huckleberry”,而不是“huckle bearer”。 imsdb.com/scripts/Tombstone.html ...就像在“哈克贝利·费恩”中一样——指的是典型的“每个人”,他们本能地努力“做正确的事”——你永远可以信赖的真正朋友...因此“我是你的哈克贝利”,意思是“你可以指望我”。【参考方案2】:

我在我的模型上使用ScriptIgnore 属性,如下所示:

public class Item

    [ScriptIgnore]
    public Item ParentItem  get; set; 

在这个特定的场景中,我从 Json 序列化程序中得到了一个循环引用错误,所以我只是忽略了它。当我开始了解 Model 和 ViewModel 之间的区别时,我是 asking a similar question here on SO。

【讨论】:

如果它不是 POCO 而是生成的 EntityModel,我不想编辑生成的代码,是否有解决方法将 ScriptIgnore 属性添加到生成的实体模型。 @hazimdikenli 您可能必须为此使用部分类。 不要忘记添加对“System.Web.Extensions”的引用以使其正常工作 这帮助我阻止了我的 toJson(Model) 带回一些不需要的字段,但理想情况下,使用 API,您需要使用新模型和控制器创建一个新区域,以避免交叉注释。 .但我太懒了。谢谢+1【参考方案3】:

您只需要添加 [ScriptIgnore(ApplyToOverrides = true)] 到您的文本模板 (.tt) 文件中。

这是我之前的文本模板的一部分

#>
<#=codeStringGenerator.NavigationProperty(navigationProperty)#>
<#

在我插入代码后,codeStringGenerator 上方的行会自动生成,如下所示:

[ScriptIgnore(ApplyToOverrides = true)]
public virtual ICollection<Currency> Currencies  get; set; 

我还需要修改UsingDirectives函数以插入"using System.Web.Script.Serialization;"

【讨论】:

ApplyToOverrides 似乎对虚拟财产非常重要【参考方案4】:

将属性设置为内部。不过,这取决于您的结构。考虑。

【讨论】:

以上是关于在 .NET JSON 序列化期间忽略字段;类似于 [XmlIgnore]?的主要内容,如果未能解决你的问题,请参考以下文章

在 xml 序列化期间忽略属性,但在反序列化期间不忽略

如何忽略 JSON 响应中列表中的特定字段

Json.net 忽略实体某些属性的序列化

如果值为空,如何告诉杰克逊在序列化期间忽略一个字段?

忽略 Json.net 中的空字段

在使用 Jackson 反序列化期间选择性地忽略 JSON 属性