Beispiel #1
0
        public async void RequiredNonDeserializablePropertyThrows()
        {
            JsonSerializerOptions options = new()
            {
                TypeInfoResolver = new DefaultJsonTypeInfoResolver()
                {
                    Modifiers =
                    {
                        (ti) =>
                        {
                            for (int i = 0; i < ti.Properties.Count; i++)
                            {
                                if (ti.Properties[i].Name == nameof(PersonWithRequiredMembers.FirstName))
                                {
                                    ti.Properties[i].Set = null;
                                }
                            }
                        }
                    }
                }
            };

            string json = "" "{" FirstName ":" foo "," MiddleName ":" "," LastName ":" bar "}" "";
            InvalidOperationException exception = await Assert.ThrowsAsync <InvalidOperationException>(async() => await Serializer.DeserializeWrapper <PersonWithRequiredMembers>(json, options));

            Assert.Contains(nameof(PersonWithRequiredMembers.FirstName), exception.Message);
        }
Beispiel #2
0
        public JsonConverter GetConverter(Type typeToConvert)
        {
            if (typeToConvert is null)
            {
                ThrowHelper.ThrowArgumentNullException(nameof(typeToConvert));
            }

            DefaultJsonTypeInfoResolver.RootDefaultInstance();
            return(GetConverterFromTypeInfo(typeToConvert));
        }
Beispiel #3
0
        public async void RemovingPropertiesWithRequiredKeywordAllowsDeserialization()
        {
            JsonSerializerOptions options = new()
            {
                TypeInfoResolver = new DefaultJsonTypeInfoResolver()
                {
                    Modifiers =
                    {
                        (ti) =>
                        {
                            for (int i = 0; i < ti.Properties.Count; i++)
                            {
                                if (ti.Properties[i].Name == nameof(PersonWithRequiredMembers.FirstName))
                                {
                                    Assert.True(ti.Properties[i].IsRequired);
                                    JsonPropertyInfo property = ti.CreateJsonPropertyInfo(typeof(string), nameof(PersonWithRequiredMembers.FirstName));
                                    property.Get     = (obj) => ((PersonWithRequiredMembers)obj).FirstName;
                                    property.Set     = (obj, val) => ((PersonWithRequiredMembers)obj).FirstName = (string)val;
                                    ti.Properties[i] = property;
                                }
                                else if (ti.Properties[i].Name == nameof(PersonWithRequiredMembers.LastName))
                                {
                                    Assert.True(ti.Properties[i].IsRequired);
                                    JsonPropertyInfo property = ti.CreateJsonPropertyInfo(typeof(string), nameof(PersonWithRequiredMembers.LastName));
                                    property.Get     = (obj) => ((PersonWithRequiredMembers)obj).LastName;
                                    property.Set     = (obj, val) => ((PersonWithRequiredMembers)obj).LastName = (string)val;
                                    ti.Properties[i] = property;
                                }
                                else
                                {
                                    Assert.False(ti.Properties[i].IsRequired);
                                }
                            }
                        }
                    }
                }
            };

            var obj = new PersonWithRequiredMembers()
            {
                FirstName = "foo",
                LastName  = "bar"
            };

            string json = await Serializer.SerializeWrapper(obj, options);

            Assert.Equal("" "{" FirstName ":" foo "," MiddleName ":" "," LastName ":" bar "}" "", json);

            json = "" "{" LastName ":" bar "}" "";
            PersonWithRequiredMembers deserialized = await Serializer.DeserializeWrapper <PersonWithRequiredMembers>(json, options);

            Assert.Null(deserialized.FirstName);
            Assert.Equal("", deserialized.MiddleName);
            Assert.Equal("bar", deserialized.LastName);
        }
Beispiel #4
0
        protected override IJsonTypeInfoResolver CreateResolverWithModifiers(params Action <JsonTypeInfo>[] modifiers)
        {
            var resolver = new DefaultJsonTypeInfoResolver();

            foreach (var modifier in modifiers)
            {
                resolver.Modifiers.Add(modifier);
            }

            return(resolver);
        }
Beispiel #5
0
        public JsonConverter GetConverter(Type typeToConvert)
        {
            if (typeToConvert is null)
            {
                ThrowHelper.ThrowArgumentNullException(nameof(typeToConvert));
            }

            if (_typeInfoResolver is null)
            {
                // Backward compatibility -- root & query the default reflection converters
                // but do not populate the TypeInfoResolver setting.
                return(DefaultJsonTypeInfoResolver.GetConverterForType(typeToConvert, this));
            }

            return(GetConverterInternal(typeToConvert));
        }
Beispiel #6
0
        private JsonConverter GetConverterFromOptionsOrReflectionConverter(Type typeToConvert)
        {
            Debug.Assert(typeToConvert != null);

            // Priority 1: Attempt to get custom converter from the Converters list.
            JsonConverter?converter = GetConverterFromOptions(typeToConvert);

            // Priority 2: Attempt to get converter from [JsonConverter] on the type being converted.
            if (converter == null)
            {
                JsonConverterAttribute?converterAttribute = (JsonConverterAttribute?)
                                                            GetAttributeThatCanHaveMultiple(typeToConvert, typeof(JsonConverterAttribute));

                if (converterAttribute != null)
                {
                    converter = GetConverterFromAttribute(converterAttribute, typeToConvert: typeToConvert, classTypeAttributeIsOn: typeToConvert, memberInfo: null);
                }
            }

            // Priority 3: Attempt to get built-in converter.
            converter ??= DefaultJsonTypeInfoResolver.GetDefaultConverter(typeToConvert);

            // Allow redirection for generic types or the enum converter.
            if (converter is JsonConverterFactory factory)
            {
                converter = factory.GetConverterInternal(typeToConvert, this);

                // A factory cannot return null; GetConverterInternal checked for that.
                Debug.Assert(converter != null);
            }

            Type converterTypeToConvert = converter.TypeToConvert;

            if (!converterTypeToConvert.IsAssignableFromInternal(typeToConvert) &&
                !typeToConvert.IsAssignableFromInternal(converterTypeToConvert))
            {
                ThrowHelper.ThrowInvalidOperationException_SerializationConverterNotCompatible(converter.GetType(), typeToConvert);
            }

            return(converter);
        }
Beispiel #7
0
        public async void ChangingPropertiesWithRequiredKeywordToNotBeRequiredAllowsDeserialization()
        {
            JsonSerializerOptions options = new()
            {
                TypeInfoResolver = new DefaultJsonTypeInfoResolver()
                {
                    Modifiers =
                    {
                        (ti) =>
                        {
                            for (int i = 0; i < ti.Properties.Count; i++)
                            {
                                ti.Properties[i].IsRequired = false;
                            }
                        }
                    }
                }
            };

            var obj = new PersonWithRequiredMembers()
            {
                FirstName = "foo",
                LastName  = "bar"
            };

            string json = await Serializer.SerializeWrapper(obj, options);

            Assert.Equal("" "{" FirstName ":" foo "," MiddleName ":" "," LastName ":" bar "}" "", json);

            json = "" "{" LastName ":" bar "}" "";
            PersonWithRequiredMembers deserialized = await Serializer.DeserializeWrapper <PersonWithRequiredMembers>(json, options);

            Assert.Null(deserialized.FirstName);
            Assert.Equal("", deserialized.MiddleName);
            Assert.Equal("bar", deserialized.LastName);
        }