2014-09-03 159 views
0

我已经实现了DefaultContractResolver以包含某些我想要序列化的属性。我可以使用下面的代码提取出每个属性和Object.property(嵌套对象),但是,尝试序列化它时,找不到嵌套对象的property.property,并且转换失败。实现DefaultContractResolver以包含某些属性

public class DynamicContractResolver : DefaultContractResolver 
{ 
    private List<string> mPropertiesToSerialize = null; 

    public DynamicContractResolver(List<string> propertiesToSerialize) 
    { 
     this.mPropertiesToSerialize = propertiesToSerialize; 
    } 

    protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization) 
    { 
     IList<JsonProperty> objProperties = new List<JsonProperty>(); 
     IList<JsonProperty> properties = base.CreateProperties(type, memberSerialization); 

     objProperties = properties.Where(p => mPropertiesToSerialize.Contains(p.PropertyName)).ToList(); 

     foreach (var jProperty in properties) 
     { 
      if (!jProperty.PropertyType.IsClass) 
       continue; 

      var nestedObjProperties = base.CreateProperties(jProperty.PropertyType, memberSerialization); 
      foreach (var nestedjProperty in nestedObjProperties) 
      { 
       if (objProperties.Any(nj => (nj.PropertyName == nestedjProperty.PropertyName))) 
        continue; 

       if (mPropertiesToSerialize.Contains(nestedjProperty.PropertyName)) 
       { 
        objProperties.Add(nestedjProperty); 
       } 
      } 
     } 
     return objProperties; 
    } 
} 

用途,其中失败:

var contractResolver = new DynamicContractResolver(propertiesToSerialize);   
var serializedObj = 
JsonConvert.SerializeObject(contact, Formatting.None, 
       new JsonSerializerSettings { ContractResolver = contractResolver }); 

以上使用,我可以把它遍历联系对象的所有属性,但系列化,它似乎并没有在深入到像嵌入对象在这里帐户并抛出该属性未找到的错误。由于我使用的JsonProperty列表,我希望我添加到列表中的对象序列化有足够的信息serialize从嵌套对象提取适当的属性。显然这只有1层深,但这不是问题的关键。

为什么不钻入嵌套对象并从联系人中提取属性值?

public class Contact 
{ 
    public string Name{ get; set; } 
    public Account Account { get; set; } 
} 
public class Account 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public string EmailAddress { get; set; } 
} 
+0

你传递给'propertiesToSerialize'什么? – 2014-09-03 23:24:42

+0

属性名称列表。在这个例子中,它会是这样的: 案例#1 名称 Account.Id Account.EmailAddress 案例#2 名称 标识 EmailAddress的 我试图传递特性两种方式为列表,它永远不会拖动Id和EmailAddress进行序列化。 – ExceptionRethrow 2014-09-04 04:50:24

回答

0

找到了解决此问题的方法。

而不是重写createProperties,我结束了通过重写CreateProperty(JsonProperty CreateProperty(MemberInfo成员,MemberSerialization memberSerialization))不需要的属性为每个属性设置property.ShouldSerialize为false,并取回所需的那些!

相关问题