从JSON中排除域模型对象的属性
问题描述:
我使用Newtonsoft JSON序列化在卫星程序集中定义的对象图。我有一个循环引用,导致JSON中的递归限制被超过,并且增加了额外的膨胀到已经数据较重的POST。从JSON中排除域模型对象的属性
记录的方法是将JsonIgnore
属性添加到我的数据对象上的属性,但这需要我的域项目中的Newtonsoft.Json引用。有没有其他方式排除序列化属性?
答
您可以在模型的属性,它引用System.Runtime.Serialization
应用[IgnoreDataMember]
属性。所有其他属性将默认序列化。
例如
public class MyViewModel
{
public string SerializedProperty { get; set; }
[IgnoreDataMember]
public string IgnoredProperty { get; set; }
}
答
有类似的问题。我在完成过度工作和过度工程时,使用自定义属性和合约解析器解决了这个问题,所以在我的模型中,我不需要引用任何外部库(System除外)。
声明自己的属性,如
[AttributeUsage(AttributeTargets.Property)]
public sealed class IgnoreMeAttribute : Attribute
{
}
装饰你的模型
[IgnoreMe]
public string IgnoreMePlease { get; set; }
添加
public class ShouldSerializeContractResolver : DefaultContractResolver
{
public static readonly ShouldSerializeContractResolver Instance = new ShouldSerializeContractResolver();
protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
{
var property = base.CreateProperty(member, memberSerialization);
if (property.AttributeProvider.GetAttributes(typeof (IgnoreMeAttribute), false).Any())
property.ShouldSerialize = instance => false;
return property;
}
}
,并用它
var result = JsonConvert.SerializeObject(value, Formatting.None, new JsonSerializerSettings { ContractResolver = ShouldSerializeContractResolver.Instance });
答
替代1
你应该能够与[DataMember]
一起使用[DataContract]
。
[DataContract]
public class MyDomainModel
{
[DataMember]
public string PublicString { get; set; }
public string HiddenString { get; set; }
public MyDomainModel InfiniteReference { get; set; }
}
它需要参考System.Runtime.Serialization
。
实施例:
[HttpGet]
public MyDomainModel GetModels()
{
var model = new MyDomainModel
{
HiddenString = "Hidden",
PublicString = "Public",
};
model.InfiniteReference = model;
return model;
}
输出:
{
"publicString": "Public"
}
备选2
我有一个循环引用[...]
您可以使用ReferenceLoopHandling
,它只是简单地削减循环引用。但是,这可能不是你想要的,当你提到其他额外膨胀。
config.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
+0
是的。应该肯定会工作。 –
用最小的努力解决了这个问题。谢谢! – Echilon