diff --git a/Neo4jClient.Tests/Serialization/CustomJsonDeserializerTests.cs b/Neo4jClient.Tests/Serialization/CustomJsonDeserializerTests.cs index 136120104..997edbea1 100644 --- a/Neo4jClient.Tests/Serialization/CustomJsonDeserializerTests.cs +++ b/Neo4jClient.Tests/Serialization/CustomJsonDeserializerTests.cs @@ -8,6 +8,7 @@ using Neo4jClient.ApiModels.Gremlin; using Neo4jClient.Serialization; using Newtonsoft.Json; +using Newtonsoft.Json.Converters; namespace Neo4jClient.Test.Serialization { @@ -208,6 +209,36 @@ public void ReadJsonCanMapNullableEnumsToEnum() Assert.AreEqual(expected, result); } + private class DateTimeDeserializer : DateTimeConverterBase + { + public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) + { + if (value.GetType().IsAssignableFrom(typeof(DateTime))) + writer.WriteValue(((DateTime)value).Ticks); + } + + public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) + { + if (objectType.IsAssignableFrom(typeof(DateTime))) + return new DateTime(long.Parse(reader.Value.ToString())); + + return DateTime.MinValue; + } + } + + [Test] + public void DeserializeShouldUseCustomSerializerBeforeDefault() + { + var deserializer = new CustomJsonDeserializer(new List(GraphClient.DefaultJsonConverters) { new DateTimeDeserializer() }); + var expected = new DateTime(2000, 1, 1).Date; + + var deserializeDateTime = deserializer.Deserialize("{\"Foo\":\"630822816000000000\"}"); + + Assert.IsNotNull(deserializeDateTime.Foo); + Assert.AreEqual(expected, deserializeDateTime.Foo.Value); + } + + [Test] [TestCase("{\"Gender\": \"Female\"}", Gender.Female)] [TestCase("{\"Gender\": \"1\"}", Gender.Female)] diff --git a/Neo4jClient/Serialization/CommonDeserializerMethods.cs b/Neo4jClient/Serialization/CommonDeserializerMethods.cs index 78abd26d6..0372f4e8a 100644 --- a/Neo4jClient/Serialization/CommonDeserializerMethods.cs +++ b/Neo4jClient/Serialization/CommonDeserializerMethods.cs @@ -84,6 +84,10 @@ public static object CoerceValue(DeserializationContext context, PropertyInfo pr return null; var propertyType = propertyInfo.PropertyType; + object jsonConversionResult; + if (TryJsonConverters(context, propertyType, value, out jsonConversionResult)) + return jsonConversionResult; + Type genericTypeDef = null; if (propertyType.IsGenericType) @@ -165,10 +169,6 @@ public static object CoerceValue(DeserializationContext context, PropertyInfo pr return Convert.FromBase64String(value.Value()); } - object jsonConversionResult; - if (TryJsonConverters(context, propertyType, value, out jsonConversionResult)) - return jsonConversionResult; - if (genericTypeDef == typeof(List<>)) { var list = BuildList(context, propertyType, value.Children(), typeMappings, nestingLevel + 1);