2

我正在使用 JSON.NET 将一个类序列化为 JSON。该类包含一个由项目列表组成的属性,我想以自定义方式序列化项目本身(通过使用自定义的 ContractResolver 仅动态包含某些属性)。所以基本上我想使用 DefaultContractResolver 以标准方式序列化父类本身,但使用我自己的 ContractResolver 以自定义方式序列化这个属性。

JSON.NET 有可能允许这样做的方法,但文档相当粗略。任何帮助,将不胜感激。

4

2 回答 2

2

我用 ContractResolver 解决了这个问题。我要序列化的对象列表是异构的,所以我必须向它传递两个参数,一个要序列化的属性列表,以及一个属性列表适用的类型列表。所以它看起来像这样:

    public class DynamicContractResolver : DefaultContractResolver
    {
        private List<string> mPropertiesToSerialize = null;
        private List<string> mItemTypeNames = new List<string>();

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

        protected override IList<JsonProperty> CreateProperties( Type type, MemberSerialization memberSerialization )
        {
            IList<JsonProperty> properties = base.CreateProperties( type, memberSerialization );
            if( this.mItemTypeNames.Contains( type.Name ) )
                properties = properties.Where( p => mPropertiesToSerialize.Contains( p.PropertyName ) ).ToList();
            return properties;
        }
    }

它是这样调用的:

            DynamicContractResolver contractResolver = new DynamicContractResolver( propsToSerialize, GetItemTypeNames() );
            json = JsonConvert.SerializeObject( this, Formatting.None,
                new JsonSerializerSettings { ContractResolver = contractResolver } );

其中 GetItemTypeNames() 对列表中要序列化的每个项目调用 GetType().Name 并将它们清楚地写入列表。

抱歉,我最初的问题含糊不清,措辞不好,如果有人有更好的解决方案,我当然不会赞成这个问题。

于 2013-08-19T16:03:16.457 回答
0

这是一个更好的版本。它将类型名称与属性相关联,因此您可以指定希望在每个级别序列化的属性。字典的键是类型名称;该值是要为每种类型序列化的属性列表。

class PropertyContractResolver : DefaultContractResolver
{
    public PropertyContractResolver( Dictionary<string, IEnumerable<string>> propsByType )  
    {
        PropertiesByType = propsByType;
    }

    protected override IList<JsonProperty> CreateProperties( Type type, MemberSerialization memberSerialization )
    {
        IList<JsonProperty> properties = base.CreateProperties( type, memberSerialization );
        if( this.PropertiesByType.ContainsKey( type.Name ) )
        {
            IEnumerable<string> propsToSerialize = this.PropertiesByType[ type.Name ];
            properties = properties.Where( p => propsToSerialize.Contains( p.PropertyName ) ).ToList();
        }
        return properties;
    }

    private Dictionary<string, IEnumerable<string>> PropertiesByType
    {
        get;
        set;
    }

}
于 2018-10-22T16:25:07.563 回答