поддерживает ли Newton JSON IfSerialize для дочерних свойств? - PullRequest
0 голосов
/ 25 октября 2019

Скажем, у меня есть объект в этом формате:

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 эти функции также вызывались, поэтому я могу исключить поля дочерних объектов.

Возможно ли это?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...