【问题标题】:JsonIgnore attribute is not working for one property of an ASP.NET MVC entityJsonIgnore 属性不适用于 ASP.NET MVC 实体的一个属性
【发布时间】:2018-06-04 04:43:15
【问题描述】:

我的 ASP.NET MVC 项目中有一个像这样的简单实体:

public class Folder : EntityData
{
    public Folder()
    {
        IsStub = false;
    }

    [StringLength(300)]
    public string Name { get; set; }

    [JsonIgnore]
    public bool IsStub { get; set; }

    [ForeignKey("ParentFolderObj")]
    public string ParentFolder { get; set; }

    [JsonIgnore]
    public Folder ParentFolderObj { get; set; }

    [JsonIgnore]
    public virtual ICollection<DesktopFolder> DesktopFolders { get; set; }
    [JsonIgnore]
    public virtual ICollection<UserFolder> UserFolders { get; set; }
}

EntityData 是 Azure 的 MobileAppServices SDK 提供的类:

public abstract class EntityData : ITableData
{
    protected EntityData();

    [Key]
    [TableColumn(TableColumnType.Id)]
    public string Id { get; set; }
    [TableColumn(TableColumnType.Version)]
    [Timestamp]
    public byte[] Version { get; set; }
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    [Index(IsClustered = true)]
    [TableColumn(TableColumnType.CreatedAt)]
    public DateTimeOffset? CreatedAt { get; set; }
    [DatabaseGenerated(DatabaseGeneratedOption.Computed)]
    [TableColumn(TableColumnType.UpdatedAt)]
    public DateTimeOffset? UpdatedAt { get; set; }
    [TableColumn(TableColumnType.Deleted)]
    public bool Deleted { get; set; }
}

在我的序列化响应中,例如当我检索我的所有文件夹时,我仍然会看到“IsStub”字段,即使它被标记为 [JsonIgnore]。

我正在使用 Newtonsoft.Json 进行(反)序列化,以下配置适用于所有项目并在启动时设置:

HttpConfiguration config = new HttpConfiguration();
config.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
config.Formatters.JsonFormatter.SerializerSettings.PreserveReferencesHandling = PreserveReferencesHandling.Objects;
config.Formatters.Remove(config.Formatters.XmlFormatter);

如您所见,响应中没有正确显示其他 [JsonIgnore] 字段,如下所示:

{
  "deleted": false,
  "updatedAt": null,
  "createdAt": "2018-06-03T06:13:31.66Z",
  "version": "AAAAAAAACJc=",
  "id": "042d81b8-4599-43ec-b462-8cbaf6ecd672",
  "parentFolder": null,
  "isStub": false,
  "name": "Folder636636104113385950"
}

如何使 "IsStub" 字段从我的回复中消失?

我还尝试用[ScriptIgnore] 标记该字段,但没有成功。

【问题讨论】:

  • 如果你不是使用json.net来序列化或反序列化,你应该添加ScriptIgnoreAttributemsdn.microsoft.com/en-us/library/…
  • IsStub 属性是否也在EntityData 类中定义?
  • 你是用json.net方法还是.netJavaScriptSerializer 序列化数据?改为检查[ScriptIgnore] 属性
  • 使用 Newtonsoft.Json 进行(反)序列化。
  • IsStub 不是 EntityData 的一部分

标签: c# json asp.net-mvc json-serialization


【解决方案1】:

在您的“EntityData”类中实现以下内容:

public virtual bool ShouldSerializeIsStub()
{
  return true;
}

像这样覆盖“文件夹”类中的函数:

public override bool ShouldSerializeIsStub()
{
  return false;
}

[JsonIgnore]“标签”(是标签吗?)是正确的。 其余的都还好。这对我来说很好。我希望,它会为你做同样的事情。

【讨论】:

  • 嗨 Nico,不幸的是 EntityData 是 MS Azure SDK 中的一个类,我无法触摸它。
猜你喜欢
  • 2015-10-17
  • 1970-01-01
  • 2011-02-26
  • 1970-01-01
  • 2021-06-07
  • 2020-02-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多