json.net - C# json.net 子对象的自定义序列化

标签 json.net

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

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

最佳答案

我用 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 并将它们明确写入列表。

抱歉,我原来的问题含糊不清,措辞也很糟糕,如果有人有更好的解决方案,我当然不会坚持这个。

关于json.net - C# json.net 子对象的自定义序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18235973/

相关文章:

c# - 如何使用 NewtonSoft 库忽略空数组元素

c# - Json.net LinearGradientBrush序列化

c# - 使用 Json.NET 序列化为 NDJSON

c# - 来自字典 C# 的 Json 格式

json.net - 没有带有设置和转换器参数的 Json.net 构造函数

c# - Visual Studio 2012 项目 - 无法加载 'Newtonsoft.Json'

python - 我可以将 Json 反序列化为 Python 中的 C# Newtonsoft 类吗

json - 如何在 Webhook 中接收 json post 数据

c# - 使用带有 JSON.Net 的自定义反序列化器反序列化 JSON

c# - Java 的 "org.json"与 C#'s "Newtonsoft.Json.JsonConvert"