【问题标题】:Implementing DefaultContractResolver to include certain properties实现 DefaultContractResolver 以包含某些属性
【发布时间】:2014-09-03 21:26:39
【问题描述】:

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

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 });

使用上面的方法,我可以让它迭代 Contact 对象的所有属性,但在序列化时,它似乎没有深入到像 Account here 这样的嵌入对象,并抛出找不到属性的错误。由于我使用的是 JsonProperty 列表,我希望我添加到要序列化的列表中的对象有足够的信息用于序列化以从嵌套对象中提取适当的属性。显然,这只有 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; }
}

【问题讨论】:

  • 你要传递什么给propertiesToSerialize
  • 属性名称列表。在示例中,它类似于: Case #1 Name Account.Id Account.EmailAddress Case #2 Name Id EmailAddress 我已经尝试以列表的方式两种方式传递属性,但它永远不会拉 Id 和 EmailAddress 进行序列化。

标签: c# asp.net-mvc json serialization json.net


【解决方案1】:

找到解决此问题的方法。

我最终没有覆盖 createProperties,而是通过覆盖不需要的 CreateProperty (JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)) 将每个属性的 property.ShouldSerialize 设置为 false,然后只取回需要的属性!

【讨论】:

    猜你喜欢
    • 2011-08-09
    • 1970-01-01
    • 2014-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-03
    相关资源
    最近更新 更多