internal override void ReadEnumerable(JsonTokenType tokenType, JsonSerializerOptions options, ref ReadStack state, ref Utf8JsonReader reader) { if (ValueConverter != null) { if (ValueConverter.TryRead(RuntimePropertyType, ref reader, out TRuntimeProperty value)) { ReadStackFrame.SetReturnValue(value, options, ref state.Current); return; } } ThrowHelper.ThrowJsonReaderException_DeserializeUnableToConvertValue(RuntimePropertyType, reader, state); }
internal override void ReadEnumerable(JsonTokenType tokenType, JsonSerializerOptions options, ref ReadStack state, ref Utf8JsonReader reader) { if (ValueConverter != null) { Type propertyType = PropertyType; if (propertyType.IsGenericType && propertyType.GetGenericTypeDefinition() == typeof(Nullable <>)) { propertyType = Nullable.GetUnderlyingType(propertyType); } if (ValueConverter.TryRead(propertyType, ref reader, out TProperty value)) { ReadStackFrame.SetReturnValue(value, options, ref state.Current); return; } } ThrowHelper.ThrowJsonReaderException_DeserializeUnableToConvertValue(PropertyType, reader, state); }
private static bool HandleNull(ref Utf8JsonReader reader, ref ReadStack state, JsonSerializerOptions options) { if (state.Current.Skip()) { return(false); } // If we don't have a valid property, that means we read "null" for a root object so just return. if (state.Current.JsonPropertyInfo == null) { Debug.Assert(state.IsLastFrame); Debug.Assert(state.Current.ReturnValue == null); return(true); } JsonPropertyInfo propertyInfo = state.Current.JsonPropertyInfo; if (!propertyInfo.CanBeNull) { ThrowHelper.ThrowJsonReaderException_DeserializeCannotBeNull(reader, state); } if (state.Current.IsEnumerable() || state.Current.IsPropertyEnumerable()) { ReadStackFrame.SetReturnValue(null, options, ref state.Current); return(false); } if (state.Current.ReturnValue == null) { Debug.Assert(state.IsLastFrame); return(true); } if (!propertyInfo.IgnoreNullValues) { state.Current.JsonPropertyInfo.SetValueAsObject(state.Current.ReturnValue, null, options); } return(false); }
private static bool HandleEndArray( JsonSerializerOptions options, ref ReadStack state) { bool lastFrame = state.IsLastFrame; if (state.Current.Drain) { // The array is not being applied to the object. state.Pop(); return(lastFrame); } IEnumerable value = ReadStackFrame.GetEnumerableValue(state.Current); if (value == null) { // We added the items to the list property already. state.Current.ResetProperty(); return(false); } bool setPropertyDirectly; if (state.Current.TempEnumerableValues != null) { JsonEnumerableConverter converter = state.Current.JsonPropertyInfo.EnumerableConverter; Debug.Assert(converter != null); Type elementType = state.Current.GetElementType(); value = converter.CreateFromList(elementType, (IList)value); setPropertyDirectly = true; } else { setPropertyDirectly = false; } bool valueReturning = state.Current.PopStackOnEndArray; if (state.Current.PopStackOnEndArray) { state.Pop(); } if (lastFrame) { if (state.Current.ReturnValue == null) { // Returning a converted list or object. state.Current.Reset(); state.Current.ReturnValue = value; return(true); } else if (state.Current.IsEnumerable()) { // Returning a non-converted list. return(true); } // else there must be an outer object, so we'll return false here. } ReadStackFrame.SetReturnValue(value, options, ref state.Current, setPropertyDirectly: setPropertyDirectly); if (!valueReturning) { state.Current.ResetProperty(); } return(false); }