我使用Newtonsoft JSON序列化在衛星程序集中定義的對象圖。我有一個循環引用,導致JSON中的遞歸限制被超過,並且增加了額外的膨脹到已經數據較重的POST。從JSON中排除域模型對象的屬性
記錄的方法是將JsonIgnore
屬性添加到我的數據對象上的屬性,但這需要我的域項目中的Newtonsoft.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;
是的。應該肯定會工作。 –
用最小的努力解決了這個問題。謝謝! – Echilon