JSON.net JsonIgnoreAttribute不使用“EntityKey”属性

时间:2011-12-21 14:29:27

标签: json entity-framework serialization json.net

我正在使用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
    { 
    }

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

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

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

        [JsonIgnore]
        public System.Data.EntityKey EntityKey { get; set; }
    }

使用此类,“EntityKey”属性仍然是序列化的。我做错了什么?

2 个答案:

答案 0 :(得分: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();
    }
}

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

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

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

答案 1 :(得分:2)

我认为最新版本的JSON.NET现在很荣幸。此示例在MVC站点中为我们工作,但您可以使用所需的字符串。

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