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); }
public JsonConverter GetConverter(Type typeToConvert) { if (typeToConvert is null) { ThrowHelper.ThrowArgumentNullException(nameof(typeToConvert)); } DefaultJsonTypeInfoResolver.RootDefaultInstance(); return(GetConverterFromTypeInfo(typeToConvert)); }
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); }
protected override IJsonTypeInfoResolver CreateResolverWithModifiers(params Action <JsonTypeInfo>[] modifiers) { var resolver = new DefaultJsonTypeInfoResolver(); foreach (var modifier in modifiers) { resolver.Modifiers.Add(modifier); } return(resolver); }
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)); }
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); }
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); }