JSON.net JsonIgnoreAttribute 无法使用"EntityKey"属性



我正在使用JSON.net序列化我的EntityFramework对象。

在过去,我创建了一个类,它将"JsonIgnore"属性应用于一个属性,然后我将主EntityFramework类的"MetadataType"属性设置为新创建的类。

下面是一个例子:

将应用于EF类的类:

 public class Role_DoNotSerialize
    {
        [JsonIgnore]
        public string Users { get; set; }
    }

EF类的部分类文件:

[MetadataType(typeof(Role_DoNotSerialize))]
    public partial class Role
    { 
    }

在上面的例子中,属性"Users"在序列化"Role"对象时不会被序列化。

我的问题是,当我添加EntityKey属性时,同样的技术无法工作,如:

public class Role_DoNotSerialize
    {
        [JsonIgnore]
        public string Users { get; set; }
        [JsonIgnore]
        public System.Data.EntityKey EntityKey { get; set; }
    }

使用这个类,"EntityKey"属性仍然是序列化的。我做错了什么?

您可以通过实现自己的ContractResolver(使用JSON的示例代码)来做到这一点。. NET 4.5,但也可以使用旧版本)

public class ExcludeEntityKeyContractResolver : DefaultContractResolver
{
    protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
    {
        IList<JsonProperty> properties = base.CreateProperties(type,memberSerialization);
        return properties.Where(p => p.PropertyType != typeof (System.Data.EntityKey)).ToList();
    }
}

你可以设置它来为你的JsonSerializerSettings对象设置ContractResolver

JsonSerializerSettings serializerSettings = new JsonSerializerSettings();
serializerSettings.ContractResolver = new ExcludeEntityKeyContractResolver();

请注意,您不仅限于一个lambda函数,还可以实现任何类型的检查。您甚至可以覆盖Converter per属性来进行自定义序列化。

我认为JSON的最新版本。NET现在尊重这一点。这个示例在MVC站点中为我们工作,但是您可以随意使用字符串。

public ActionResult ContentJsonFormatted(object obj, Formatting formatting = Formatting.Indented)
{
    string result = JsonConvert.SerializeObject(obj, formatting);
    return Content(result, "text/plain");
}

最新更新