我正在使用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”属性仍然是序列化的。我做错了什么?
答案 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");
}