首页 > 解决方案 > newton json 是否支持子属性上的 ShouldSerialize?

问题描述

假设我有一个具有这种格式的对象:

new LookUpResponse
            {
                LookUpDetails =
                    new List<LookUpDetail>
                    {
                        new LookUpDetail
                        {
                            LookUpCode = "GB00B6RLLV55",
                            CitiCode = "GTUI",
                            UnitName = "Liontrust Asia Income A Inc",
                            UniverseCode = "O",
                            IsFundDriver = false
                        }
                    }
            };

我想要的是允许用户选择要返回的子属性(例如selectField="LookUpDetail[LookUpCode,CitiCode]"),然后我的代码解析它,所以我知道对于 LookupDetail 类型,我们想要返回 Lookkupcode 和 Citicode。

newton.json 可以吗?

我试过这个:

public class SelectFieldsResolver : DefaultContractResolver
    {
        private readonly IEnumerable<string> _selectFields;

        public SelectFieldsResolver(IEnumerable<string> selectFields)
        {
            _selectFields = selectFields;
        }
        protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
        {
            var property = base.CreateProperty(member, memberSerialization);

            property.ShouldSerialize = instance => {
                if (!_selectFields.IsNullOrEmpty() && !_selectFields.Any(f => string.Equals(f, property.PropertyName, StringComparison.InvariantCultureIgnoreCase))) return false;

                var value = instance?.GetType().GetProperty(property.PropertyName)?.GetValue(instance, null);

                return value != null;
            };

            return property;
        }

        protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
        {
            return type.GetProperties(BindingFlags.Public | BindingFlags.Instance)
                .Select(p => {
                    var jp = CreateProperty(p, memberSerialization);
                    jp.ValueProvider = new NullToEmptyStringValueProvider(p);
                    return jp;
                }).ToList();
        }
    }

但是,CreateProperty 和 CreateProperties 方法只在根级别调用(在 LookUpDetails 属性上调用),我想要的是当子对象 LookUpDetail 被序列化时,这些函数也应该被调用,所以我可以排除字段对儿童。

可能吗?

标签: json.net

解决方案


推荐阅读