Esempio n. 1
0
        private bool IsIgnored(Type type, string jsonPropertyName, string propertyName)
        {
            if (_configuration != null && _configuration.ContainsRecordConfigForType(type))
            {
                var dict = _configuration.JSONRecordFieldConfigurationsForType[type];
                if (dict != null && dict.ContainsKey(jsonPropertyName))
                {
                    return(false);
                }
            }

            if (!_ignores.ContainsKey(type))
            {
                var pd = ChoTypeDescriptor.GetProperty(type, propertyName);
                return(pd != null?pd.Attributes.OfType <ChoIgnoreMemberAttribute>().Any() : true);
            }

            return(_ignores[type].Contains(jsonPropertyName));
        }
        protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
        {
            var property         = base.CreateProperty(member, memberSerialization);
            var propertyFullName = member.GetFullName();

            if (IsIgnored(property.DeclaringType, property.PropertyName, property.UnderlyingName, propertyFullName))
            {
                property.ShouldSerialize = i => false;
                property.Ignored         = true;
            }

            if (IsRenamed(property.DeclaringType, property.PropertyName, property.UnderlyingName, propertyFullName, out var newJsonPropertyName))
            {
                if (!newJsonPropertyName.IsNullOrWhiteSpace())
                {
                    property.PropertyName = newJsonPropertyName;
                }
            }

            if (_configuration.ContainsRecordConfigForType(property.DeclaringType))
            {
                var dict = _configuration.JSONRecordFieldConfigurationsForType[property.DeclaringType];
                if (dict != null && dict.ContainsKey(property.UnderlyingName))
                {
                    property.Converter = property.MemberConverter = new ChoContractResolverJsonConverter(dict[property.UnderlyingName], _configuration.Culture,
                                                                                                         property.PropertyType, _configuration.ObjectValidationMode, member);
                }
            }
            else if (_configuration.JSONRecordFieldConfigurations.Any(f => f.DeclaringMember == propertyFullName))
            {
                var fc = _configuration.JSONRecordFieldConfigurations.First(f => f.DeclaringMember == propertyFullName);
                property.MemberConverter = new ChoContractResolverJsonConverter(fc, _configuration.Culture, property.PropertyType, _configuration.ObjectValidationMode, member);
                property.DefaultValue    = fc.DefaultValue;
                property.Order           = fc.Order;
            }
            else if (_configuration.JSONRecordFieldConfigurations.Any(f => f.Name == propertyFullName))
            {
                var fc = _configuration.JSONRecordFieldConfigurations.First(f => f.Name == propertyFullName);
                property.MemberConverter = new ChoContractResolverJsonConverter(fc, _configuration.Culture, property.PropertyType, _configuration.ObjectValidationMode, member);
                property.DefaultValue    = fc.DefaultValue;
                property.Order           = fc.Order;
            }
            else
            {
                var pd = ChoTypeDescriptor.GetProperty(property.DeclaringType, property.UnderlyingName);
                if (pd != null)
                {
                    if (pd.Attributes.OfType <DefaultValueAttribute>().Any())
                    {
                        property.DefaultValue = pd.Attributes.OfType <DefaultValueAttribute>().First().Value;
                    }
                    if (pd.Attributes.OfType <ChoJSONRecordFieldAttribute>().Any())
                    {
                        property.Order = pd.Attributes.OfType <ChoJSONRecordFieldAttribute>().First().Order;
                    }
                }
            }

            if (_configuration.NullValueHandling == ChoNullValueHandling.Ignore)
            {
                property.NullValueHandling = NullValueHandling.Ignore;
            }
            else
            {
                property.NullValueHandling = NullValueHandling.Include;
            }


            return(property);
        }