fix: AbstractGenericJsonConverter handles existing values properly

This commit is contained in:
Chris Cameron
2021-12-21 16:11:02 -05:00
parent af66147648
commit 68d1f1033a
2 changed files with 9 additions and 22 deletions

View File

@@ -32,24 +32,6 @@ namespace ICD.Common.Utils.Extensions
#else #else
JsonSerializer.CreateDefault(); JsonSerializer.CreateDefault();
#endif #endif
return extends.ReadAsObject<T>(serializer);
}
/// <summary>
/// Reads the current token in the reader and deserializes to the given type.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="extends"></param>
/// <param name="serializer"></param>
/// <returns></returns>
public static T ReadAsObject<T>([NotNull] this JsonReader extends, [NotNull] JsonSerializer serializer)
{
if (extends == null)
throw new ArgumentNullException("extends");
if (serializer == null)
throw new ArgumentNullException("serializer");
return serializer.Deserialize<T>(extends); return serializer.Deserialize<T>(extends);
} }

View File

@@ -133,23 +133,28 @@ namespace ICD.Common.Utils.Json
throw new ArgumentNullException("serializer"); throw new ArgumentNullException("serializer");
if (reader.TokenType == JsonToken.Null) if (reader.TokenType == JsonToken.Null)
return default(T); return existingValue;
if (reader.TokenType != JsonToken.StartObject) if (reader.TokenType != JsonToken.StartObject)
throw new FormatException(string.Format("Expected {0} got {1}", JsonToken.StartObject, reader.TokenType)); throw new FormatException(string.Format("Expected {0} got {1}", JsonToken.StartObject, reader.TokenType));
return ReadObject(reader, serializer); return ReadObject(reader, existingValue, serializer);
} }
/// <summary> /// <summary>
/// Override to handle deserialization of the current StartObject token. /// Override to handle deserialization of the current StartObject token.
/// </summary> /// </summary>
/// <param name="reader"></param> /// <param name="reader"></param>
/// <param name="existingValue"></param>
/// <param name="serializer"></param> /// <param name="serializer"></param>
/// <returns></returns> /// <returns></returns>
protected virtual T ReadObject(JsonReader reader, JsonSerializer serializer) protected virtual T ReadObject(JsonReader reader, T existingValue, JsonSerializer serializer)
{ {
T output = Instantiate(); // ReSharper disable CompareNonConstrainedGenericWithNull
// ReSharper disable ConvertConditionalTernaryToNullCoalescing
T output = existingValue == null ? Instantiate() : existingValue;
// ReSharper restore ConvertConditionalTernaryToNullCoalescing
// ReSharper restore CompareNonConstrainedGenericWithNull
reader.ReadObject(serializer, (p, r, s) => ReadProperty(p, r, output, s)); reader.ReadObject(serializer, (p, r, s) => ReadProperty(p, r, output, s));