一路向曦. 2021-04-22 21:01 采纳率: 0%
浏览 417

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。

 

  • 写回答

1条回答 默认 最新

  • qq_16068065 2021-12-29 10:05
    关注

    首先写一个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的属性判断(因为某个子属性类你可能定义了多个,只不过对象名不一样),每个类要求做哪些序列化,哪些不进行序列化等等。

    评论 编辑记录

报告相同问题?