牛顿json支持子属性上的ShouldSerialize吗?

时间:2019-10-25 16:29:34

标签: json.net

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

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进行序列化时,也应该调用这些函数,因此我可以排除儿童的字段。

有可能吗?

0 个答案:

没有答案
相关问题