2016-07-29 30 views
2

我使用Newtonsoft JSON序列化在衛星程序集中定義的對象圖。我有一個循環引用,導致JSON中的遞歸限制被超過,並且增加了額外的膨脹到已經數據較重的POST。從JSON中排除域模型對象的屬性

記錄的方法是將JsonIgnore屬性添加到我的數據對象上的屬性,但這需要我的域項目中的Newtonsoft.Json引用。有沒有其他方式排除序列化屬性?

回答

0

您可以在模型的屬性,它引用System.Runtime.Serialization應用[IgnoreDataMember]屬性。所有其他屬性將默認序列化。

例如

public class MyViewModel 
{ 
    public string SerializedProperty { get; set; } 

    [IgnoreDataMember] 
    public string IgnoredProperty { get; set; } 
} 
+0

用最小的努力解決了這個問題。謝謝! – Echilon

0

有類似的問題。我在完成過度工作和過度工程時,使用自定義屬性和合約解析器解決了這個問題,所以在我的模型中,我不需要引用任何外部庫(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 }); 
3

替代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

是的。應該肯定會工作。 –