From ba917e747d97eec34029f70e3f45d89aa62f33b5 Mon Sep 17 00:00:00 2001 From: tjoubert Date: Wed, 27 Jul 2022 13:40:44 +0400 Subject: [PATCH 1/7] Passed ApiClientSerializationOptions to DictionaryValueConverter and CamelCasePropertyNamesExceptDictionaryContractResolver --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 4aee972d..0f07a200 100644 --- a/.gitignore +++ b/.gitignore @@ -347,4 +347,5 @@ ASALocalRun/ healthchecksdb # Backup folder for Package Reference Convert tool in Visual Studio 2017 -MigrationBackup/ \ No newline at end of file +MigrationBackup/ +/TestApp From 46235a16c8c58218727aacd44253cc410576ec82 Mon Sep 17 00:00:00 2001 From: tjoubert Date: Wed, 27 Jul 2022 13:43:37 +0400 Subject: [PATCH 2/7] Revert "Passed ApiClientSerializationOptions to DictionaryValueConverter and CamelCasePropertyNamesExceptDictionaryContractResolver" This reverts commit ba917e747d97eec34029f70e3f45d89aa62f33b5. --- .gitignore | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 0f07a200..4aee972d 100644 --- a/.gitignore +++ b/.gitignore @@ -347,5 +347,4 @@ ASALocalRun/ healthchecksdb # Backup folder for Package Reference Convert tool in Visual Studio 2017 -MigrationBackup/ -/TestApp +MigrationBackup/ \ No newline at end of file From 9176c2f995092adf515d4d135aeebb6a740d4127 Mon Sep 17 00:00:00 2001 From: tjoubert Date: Wed, 27 Jul 2022 13:44:43 +0400 Subject: [PATCH 3/7] Passed ApiClientSerializationOptions to DictionaryValueConverter and CamelCasePropertyNamesExceptDictionaryContractResolver --- ...tyNamesExceptDictionaryContractResolver.cs | 6 +++-- .../Serialization/DictionaryValueConverter.cs | 27 +++++++++++++++---- .../JsonNetApiClientSerialization.cs | 2 +- 3 files changed, 27 insertions(+), 8 deletions(-) diff --git a/arangodb-net-standard/Serialization/CamelCasePropertyNamesExceptDictionaryContractResolver.cs b/arangodb-net-standard/Serialization/CamelCasePropertyNamesExceptDictionaryContractResolver.cs index ff546d2f..2fa4642a 100644 --- a/arangodb-net-standard/Serialization/CamelCasePropertyNamesExceptDictionaryContractResolver.cs +++ b/arangodb-net-standard/Serialization/CamelCasePropertyNamesExceptDictionaryContractResolver.cs @@ -10,16 +10,18 @@ namespace ArangoDBNetStandard.Serialization /// public class CamelCasePropertyNamesExceptDictionaryContractResolver : DefaultContractResolver { - public CamelCasePropertyNamesExceptDictionaryContractResolver() + private ApiClientSerializationOptions _serializationOptions; + public CamelCasePropertyNamesExceptDictionaryContractResolver(ApiClientSerializationOptions serializationOptions) { NamingStrategy = new CamelCaseNamingStrategy(); + _serializationOptions = serializationOptions; } protected override JsonDictionaryContract CreateDictionaryContract(Type objectType) { JsonDictionaryContract contract = base.CreateDictionaryContract(objectType); contract.DictionaryKeyResolver = propertyName => propertyName; - contract.ItemConverter = new DictionaryValueConverter(); + contract.ItemConverter = new DictionaryValueConverter(_serializationOptions); return contract; } } diff --git a/arangodb-net-standard/Serialization/DictionaryValueConverter.cs b/arangodb-net-standard/Serialization/DictionaryValueConverter.cs index eb2355a6..ca41c180 100644 --- a/arangodb-net-standard/Serialization/DictionaryValueConverter.cs +++ b/arangodb-net-standard/Serialization/DictionaryValueConverter.cs @@ -1,5 +1,6 @@ using Newtonsoft.Json; using System; +using Newtonsoft.Json.Converters; namespace ArangoDBNetStandard.Serialization { @@ -9,10 +10,12 @@ namespace ArangoDBNetStandard.Serialization /// public class DictionaryValueConverter : JsonConverter { - private static JsonSerializer _serializer = new JsonSerializer + private ApiClientSerializationOptions _serializationOptions; + + public DictionaryValueConverter(ApiClientSerializationOptions serializationOptions) { - NullValueHandling = NullValueHandling.Include - }; + _serializationOptions = serializationOptions; + } public override bool CanConvert(Type objectType) { @@ -26,8 +29,22 @@ public override object ReadJson(JsonReader reader, Type objectType, object exist public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { - // Use our local serializer for writing instead of the passed-in serializer - _serializer.Serialize(writer, value); + // Use a local serializer for writing instead of the passed-in serializer + JsonSerializer mySerializer = new JsonSerializer + { + MissingMemberHandling = _serializationOptions.IgnoreMissingMember ? MissingMemberHandling.Ignore : MissingMemberHandling.Error, + NullValueHandling = _serializationOptions.IgnoreNullValues ? NullValueHandling.Ignore : NullValueHandling.Include + }; + if (_serializationOptions.UseStringEnumConversion) + { + var stringEnumConverter = new StringEnumConverter(); + mySerializer.Converters.Add(stringEnumConverter); + } + if (_serializationOptions.UseCamelCasePropertyNames) + { + mySerializer.ContractResolver = new CamelCasePropertyNamesExceptDictionaryContractResolver(_serializationOptions); + } + mySerializer.Serialize(writer, value); } } diff --git a/arangodb-net-standard/Serialization/JsonNetApiClientSerialization.cs b/arangodb-net-standard/Serialization/JsonNetApiClientSerialization.cs index 806e0979..89635b59 100644 --- a/arangodb-net-standard/Serialization/JsonNetApiClientSerialization.cs +++ b/arangodb-net-standard/Serialization/JsonNetApiClientSerialization.cs @@ -83,7 +83,7 @@ public override string SerializeToString(T item, ApiClientSerializationOption if (serializationOptions.UseCamelCasePropertyNames) { - jsonSettings.ContractResolver = new CamelCasePropertyNamesExceptDictionaryContractResolver(); + jsonSettings.ContractResolver = new CamelCasePropertyNamesExceptDictionaryContractResolver(serializationOptions); } string json = JsonConvert.SerializeObject(item, jsonSettings); From 65705d15a1ac5533432b6a4b55a8f5ae35eda8fd Mon Sep 17 00:00:00 2001 From: tjoubert Date: Wed, 27 Jul 2022 13:58:20 +0400 Subject: [PATCH 4/7] Fixed the tests --- .../Serialization/JsonNetApiClientSerializationTest.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/arangodb-net-standard.Test/Serialization/JsonNetApiClientSerializationTest.cs b/arangodb-net-standard.Test/Serialization/JsonNetApiClientSerializationTest.cs index 43d005f0..67eba736 100644 --- a/arangodb-net-standard.Test/Serialization/JsonNetApiClientSerializationTest.cs +++ b/arangodb-net-standard.Test/Serialization/JsonNetApiClientSerializationTest.cs @@ -163,10 +163,10 @@ public void Serialize_ShouldNotCamelCaseBindVars_WhenSerializingPostCursorBody() string jsonString = Encoding.UTF8.GetString(jsonBytes); - Assert.Contains("DontCamelCaseMe", jsonString); Assert.Contains("DontCamelCaseKey", jsonString); - Assert.DoesNotContain("dontCamelCaseMe", jsonString); Assert.DoesNotContain("dontCamelCaseKey", jsonString); + Assert.Contains("dontCamelCaseMe", jsonString); + Assert.DoesNotContain("DontCamelCaseMe", jsonString); } [Fact] @@ -186,10 +186,10 @@ public void Serialize_ShouldNotCamelCaseParams_WhenSerializingPostTransactionBod string jsonString = Encoding.UTF8.GetString(jsonBytes); - Assert.Contains("DontCamelCaseMe", jsonString); Assert.Contains("DontCamelCaseKey", jsonString); - Assert.DoesNotContain("dontCamelCaseMe", jsonString); Assert.DoesNotContain("dontCamelCaseKey", jsonString); + Assert.Contains("dontCamelCaseMe", jsonString); + Assert.DoesNotContain("DontCamelCaseMe", jsonString); } [Fact] From 1f0bf2c754e830c0347fe56cfad2c5afa5adb5a1 Mon Sep 17 00:00:00 2001 From: tjoubert Date: Mon, 8 Aug 2022 17:56:47 +0400 Subject: [PATCH 5/7] Added CamelCasePropertyNamesOfObjectValuesInDictionaries option --- .../Serialization/ApiClientSerialization.cs | 3 +- .../ApiClientSerializationOptions.cs | 15 ++++++-- .../Serialization/DictionaryValueConverter.cs | 36 ++++++++++++------- 3 files changed, 38 insertions(+), 16 deletions(-) diff --git a/arangodb-net-standard/Serialization/ApiClientSerialization.cs b/arangodb-net-standard/Serialization/ApiClientSerialization.cs index 5130b733..f1608699 100644 --- a/arangodb-net-standard/Serialization/ApiClientSerialization.cs +++ b/arangodb-net-standard/Serialization/ApiClientSerialization.cs @@ -16,7 +16,8 @@ public abstract class ApiClientSerialization : IApiClientSerialization useCamelCasePropertyNames: false, ignoreNullValues: true, useStringEnumConversion: false, - ignoreMissingMember: true); + ignoreMissingMember: true, + camelCasePropertyNamesOfObjectValuesInDictionaries: false); /// /// Deserializes the data structure contained by the specified stream diff --git a/arangodb-net-standard/Serialization/ApiClientSerializationOptions.cs b/arangodb-net-standard/Serialization/ApiClientSerializationOptions.cs index b2d0b78b..4fa37239 100644 --- a/arangodb-net-standard/Serialization/ApiClientSerializationOptions.cs +++ b/arangodb-net-standard/Serialization/ApiClientSerializationOptions.cs @@ -27,6 +27,14 @@ public class ApiClientSerializationOptions /// public bool UseStringEnumConversion { get; set; } + /// + /// True to camel case the names of properties of object values + /// in dictionaries (i.e. CamelCaseMe => "camelCaseMe"). + /// False to leave the names of properties of object values + /// in dictionaries as they are (i.e. DontCamelCaseMe => "DontCamelCaseMe") + /// + public bool CamelCasePropertyNamesOfObjectValuesInDictionaries { get; set; } + /// /// Create serialization options. /// @@ -34,16 +42,19 @@ public class ApiClientSerializationOptions /// Whether null values should be ignored - i.e. not defined at all in the serialized string. /// Whether to serialize enum values to a string value instead of an integer. /// Whether missing members should be ignored. + /// Whether to camel case the names of properties of object values in dictionaries. public ApiClientSerializationOptions( bool useCamelCasePropertyNames, bool ignoreNullValues, bool useStringEnumConversion = false, - bool ignoreMissingMember = true) + bool ignoreMissingMember = true, + bool camelCasePropertyNamesOfObjectValuesInDictionaries = false) { UseCamelCasePropertyNames = useCamelCasePropertyNames; IgnoreNullValues = ignoreNullValues; UseStringEnumConversion = useStringEnumConversion; IgnoreMissingMember = ignoreMissingMember; + CamelCasePropertyNamesOfObjectValuesInDictionaries = camelCasePropertyNamesOfObjectValuesInDictionaries; } } -} +} \ No newline at end of file diff --git a/arangodb-net-standard/Serialization/DictionaryValueConverter.cs b/arangodb-net-standard/Serialization/DictionaryValueConverter.cs index ca41c180..42a4b81a 100644 --- a/arangodb-net-standard/Serialization/DictionaryValueConverter.cs +++ b/arangodb-net-standard/Serialization/DictionaryValueConverter.cs @@ -29,23 +29,33 @@ public override object ReadJson(JsonReader reader, Type objectType, object exist public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { - // Use a local serializer for writing instead of the passed-in serializer - JsonSerializer mySerializer = new JsonSerializer + // Use a local serializer for writing instead of the passed-in serializer + JsonSerializer mySerializer; + if (_serializationOptions != null && _serializationOptions.CamelCasePropertyNamesOfObjectValuesInDictionaries) { - MissingMemberHandling = _serializationOptions.IgnoreMissingMember ? MissingMemberHandling.Ignore : MissingMemberHandling.Error, - NullValueHandling = _serializationOptions.IgnoreNullValues ? NullValueHandling.Ignore : NullValueHandling.Include - }; - if (_serializationOptions.UseStringEnumConversion) - { - var stringEnumConverter = new StringEnumConverter(); - mySerializer.Converters.Add(stringEnumConverter); + mySerializer = new JsonSerializer + { + MissingMemberHandling = _serializationOptions.IgnoreMissingMember ? MissingMemberHandling.Ignore : MissingMemberHandling.Error, + NullValueHandling = _serializationOptions.IgnoreNullValues ? NullValueHandling.Ignore : NullValueHandling.Include + }; + if (_serializationOptions.UseStringEnumConversion) + { + var stringEnumConverter = new StringEnumConverter(); + mySerializer.Converters.Add(stringEnumConverter); + } + if (_serializationOptions.UseCamelCasePropertyNames) + { + mySerializer.ContractResolver = new CamelCasePropertyNamesExceptDictionaryContractResolver(_serializationOptions); + } } - if (_serializationOptions.UseCamelCasePropertyNames) + else { - mySerializer.ContractResolver = new CamelCasePropertyNamesExceptDictionaryContractResolver(_serializationOptions); + mySerializer = new JsonSerializer + { + NullValueHandling = NullValueHandling.Include + }; } mySerializer.Serialize(writer, value); } } - -} +} \ No newline at end of file From 1404bc046b7c3e74bdf7eda16cae69540e899122 Mon Sep 17 00:00:00 2001 From: tjoubert Date: Mon, 8 Aug 2022 18:03:25 +0400 Subject: [PATCH 6/7] Added Serialize_ShouldCamelCaseBindVars_WhenSerializingPostCursorBody --- .../JsonNetApiClientSerializationTest.cs | 30 ++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/arangodb-net-standard.Test/Serialization/JsonNetApiClientSerializationTest.cs b/arangodb-net-standard.Test/Serialization/JsonNetApiClientSerializationTest.cs index 67eba736..2d93ebe1 100644 --- a/arangodb-net-standard.Test/Serialization/JsonNetApiClientSerializationTest.cs +++ b/arangodb-net-standard.Test/Serialization/JsonNetApiClientSerializationTest.cs @@ -159,7 +159,35 @@ public void Serialize_ShouldNotCamelCaseBindVars_WhenSerializingPostCursorBody() }; var serialization = new JsonNetApiClientSerialization(); - byte[] jsonBytes = serialization.Serialize(body, new ApiClientSerializationOptions(true, true)); + byte[] jsonBytes = serialization.Serialize(body, new ApiClientSerializationOptions( + useCamelCasePropertyNames: true, + ignoreNullValues: true, + camelCasePropertyNamesOfObjectValuesInDictionaries: false)); + + string jsonString = Encoding.UTF8.GetString(jsonBytes); + + Assert.Contains("DontCamelCaseMe", jsonString); + Assert.Contains("DontCamelCaseKey", jsonString); + Assert.DoesNotContain("dontCamelCaseMe", jsonString); + Assert.DoesNotContain("dontCamelCaseKey", jsonString); + } + + [Fact] + public void Serialize_ShouldCamelCaseBindVars_WhenSerializingPostCursorBody() + { + var body = new PostCursorBody + { + BindVars = new Dictionary + { + ["DontCamelCaseKey"] = new { DontCamelCaseMe = true } + } + }; + var serialization = new JsonNetApiClientSerialization(); + + byte[] jsonBytes = serialization.Serialize(body, new ApiClientSerializationOptions( + useCamelCasePropertyNames: true, + ignoreNullValues: true, + camelCasePropertyNamesOfObjectValuesInDictionaries: true)); string jsonString = Encoding.UTF8.GetString(jsonBytes); From a049c0b550a893cd7d9bf817827bc6818bea4b99 Mon Sep 17 00:00:00 2001 From: tjoubert Date: Mon, 8 Aug 2022 18:07:58 +0400 Subject: [PATCH 7/7] Added Serialize_ShouldCamelCaseParams_WhenSerializingPostTransactionBody --- .../JsonNetApiClientSerializationTest.cs | 32 ++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/arangodb-net-standard.Test/Serialization/JsonNetApiClientSerializationTest.cs b/arangodb-net-standard.Test/Serialization/JsonNetApiClientSerializationTest.cs index 2d93ebe1..227050c5 100644 --- a/arangodb-net-standard.Test/Serialization/JsonNetApiClientSerializationTest.cs +++ b/arangodb-net-standard.Test/Serialization/JsonNetApiClientSerializationTest.cs @@ -210,7 +210,37 @@ public void Serialize_ShouldNotCamelCaseParams_WhenSerializingPostTransactionBod var serialization = new JsonNetApiClientSerialization(); - byte[] jsonBytes = serialization.Serialize(body, new ApiClientSerializationOptions(true, true)); + byte[] jsonBytes = serialization.Serialize(body, new ApiClientSerializationOptions( + useCamelCasePropertyNames: true, + ignoreNullValues: true, + camelCasePropertyNamesOfObjectValuesInDictionaries: false)); + + string jsonString = Encoding.UTF8.GetString(jsonBytes); + + Assert.Contains("DontCamelCaseMe", jsonString); + Assert.Contains("DontCamelCaseKey", jsonString); + Assert.DoesNotContain("dontCamelCaseMe", jsonString); + Assert.DoesNotContain("dontCamelCaseKey", jsonString); + } + + + [Fact] + public void Serialize_ShouldCamelCaseParams_WhenSerializingPostTransactionBody() + { + var body = new PostTransactionBody + { + Params = new Dictionary + { + ["DontCamelCaseKey"] = new { DontCamelCaseMe = true } + } + }; + + var serialization = new JsonNetApiClientSerialization(); + + byte[] jsonBytes = serialization.Serialize(body, new ApiClientSerializationOptions( + useCamelCasePropertyNames: true, + ignoreNullValues: true, + camelCasePropertyNamesOfObjectValuesInDictionaries: true)); string jsonString = Encoding.UTF8.GetString(jsonBytes);