从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; } 
} 
+0

用最小的努力解决了这个问题。谢谢! – Echilon

有类似的问题。我在完成过度工作和过度工程时,使用自定义属性和合约解析器解决了这个问题,所以在我的模型中,我不需要引用任何外部库(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

是的。应该肯定会工作。 –