JSON.net JsonIgnoreAttribute不使用"EntityKey"属性

Ama*_*son 7 serialization json entity-framework json.net

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

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

这是一个例子:

将应用于EF类的类:

 public class Role_DoNotSerialize
    {
        [JsonIgnore]
        public string Users { get; set; }
    }
Run Code Online (Sandbox Code Playgroud)

EF类的部分类文件:

[MetadataType(typeof(Role_DoNotSerialize))]
    public partial class Role
    { 
    }
Run Code Online (Sandbox Code Playgroud)

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

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

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

        [JsonIgnore]
        public System.Data.EntityKey EntityKey { get; set; }
    }
Run Code Online (Sandbox Code Playgroud)

使用此类,"EntityKey"属性仍然是序列化的.我究竟做错了什么?

Wil*_*eer 4

您可以通过实现自己的 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

然后您可以设置它来设置 JsonSerializerSettings 对象的 ContractResolver

JsonSerializerSettings serializerSettings = new JsonSerializerSettings();
serializerSettings.ContractResolver = new ExcludeEntityKeyContractResolver();
Run Code Online (Sandbox Code Playgroud)

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