C#Json反序列化为子类,如何只留子类的同名属性,去掉父类的同名属性

如图,

var jsonStr = returnList.ObjectToJsonString();
var newList = jsonStr.JsonStringToDynamic(new List<ReturnOrderSM>());
result.rows = newList;

反序列化后有两个ReturnID,一个值为0是父类的,另一个是一串数字子类的,也是想要用的,但是在Controller中

return Json(result, JsonRequestBehavior.AllowGet);

把对象返到JS中,就只剩一个值为0的ReturnID。

 

首先写一个JSON序列化设置的类,用于重写newtonsoft的底层序列方法


    public class LimitPropsContractResolver : DefaultContractResolver
    {
        List<string> props = null;

        bool retain;

        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="props">传入的属性数组</param>
        /// <param name="retain">true:表示props是需要保留的字段  false:表示props是要排除的字段</param>
        public LimitPropsContractResolver(List<string> props, bool retain = true)
        {
            //指定要序列化属性的清单
            this.props = props;

            this.retain = retain;
        }

        protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
        {
            IList<JsonProperty> list = base.CreateProperties(type, memberSerialization);
            if (type.Name == "你的子类名称")//或用FullName,包含子类具体的命名空间,更加准确详细
            {
                //只保留清单有列出的属性
                return list.Where(p =>
                {
                    if (retain)
                    {
                        return props.Contains(p.PropertyName);
                    }
                    else
                    {
                        return !props.Contains(p.PropertyName);
                    }
                }).ToList();
            }
            return list;//父类全部属性都序列化
        }

在调用的时候即

List<string> props = new List<string>()
            {
                "ID",
                ...
            }; //你要的子类的属性清单

            var jSetting = new JsonSerializerSettings
            {
                NullValueHandling = NullValueHandling.Ignore,//空值不序列化
                ContractResolver = new LimitPropsContractResolver(props, true)//指定要序列化属性的清单(false则是序列化清单以外的其他所有属性)
            };//写一个序列化设定

            return JsonConvert.SerializeObject("你要序列化的对象", Formatting.None, jSetting);//执行序列化以及对应设定

当然这个方法写的只是一时的解决方案,你可以为自定义重写类LimitPropsContractResolver 扩展一些属性,比如指定一个叫做【子属性类的名称集合】,JsonProperty的属性判断(因为某个子属性类你可能定义了多个,只不过对象名不一样),每个类要求做哪些序列化,哪些不进行序列化等等。