From d169fef75d883372294b4e1ef4c3e649c1bf7ebc Mon Sep 17 00:00:00 2001 From: russcam Date: Wed, 20 Mar 2019 22:32:51 +1000 Subject: [PATCH 1/2] Replace ReferenceLoopHandling with direct method call This commit replaces the ReferenceLoopHandling property manipulation in FieldsJsonConverter that is used to circumvent Json.NET's reference loop detection when Fields contains only a single Field, with a direct call to the serialization method on FieldJsonConverter for each Field. Fixes #3617 --- .../Infer/Field/FieldJsonConverter.cs | 5 +++++ .../Infer/Fields/FieldsJsonConverter.cs | 11 ++--------- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/src/Nest/CommonAbstractions/Infer/Field/FieldJsonConverter.cs b/src/Nest/CommonAbstractions/Infer/Field/FieldJsonConverter.cs index b14e34496bd..51d27c8f160 100644 --- a/src/Nest/CommonAbstractions/Infer/Field/FieldJsonConverter.cs +++ b/src/Nest/CommonAbstractions/Infer/Field/FieldJsonConverter.cs @@ -14,6 +14,11 @@ internal class FieldJsonConverter : JsonConverter public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { var field = (Field)value; + WriteField(writer, field, serializer); + } + + internal static void WriteField(JsonWriter writer, Field field, JsonSerializer serializer) + { if (field == null) { writer.WriteNull(); diff --git a/src/Nest/CommonAbstractions/Infer/Fields/FieldsJsonConverter.cs b/src/Nest/CommonAbstractions/Infer/Fields/FieldsJsonConverter.cs index d26134b5069..7207db23ee4 100644 --- a/src/Nest/CommonAbstractions/Infer/Fields/FieldsJsonConverter.cs +++ b/src/Nest/CommonAbstractions/Infer/Fields/FieldsJsonConverter.cs @@ -18,15 +18,8 @@ public override void WriteJson(JsonWriter writer, object value, JsonSerializer s writer.WriteStartArray(); if (fields != null) { - // overridden Equals() method means a Fields with only one Field - // results in Equality, which triggers Json.NET's Reference loop detection - var referenceLoopHandling = serializer.ReferenceLoopHandling; - serializer.ReferenceLoopHandling = ReferenceLoopHandling.Serialize; - - foreach (var field in fields.ListOfFields) - serializer.Serialize(writer, field); - - serializer.ReferenceLoopHandling = referenceLoopHandling; + foreach (var field in fields?.ListOfFields) + FieldJsonConverter.WriteField(writer, field, serializer); } writer.WriteEndArray(); } From 8267f1ac3873fe0a13193e887bebf53a759fe6cf Mon Sep 17 00:00:00 2001 From: russcam Date: Wed, 20 Mar 2019 22:41:53 +1000 Subject: [PATCH 2/2] Remove null conditional operator --- src/Nest/CommonAbstractions/Infer/Fields/FieldsJsonConverter.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Nest/CommonAbstractions/Infer/Fields/FieldsJsonConverter.cs b/src/Nest/CommonAbstractions/Infer/Fields/FieldsJsonConverter.cs index 7207db23ee4..d9558f97694 100644 --- a/src/Nest/CommonAbstractions/Infer/Fields/FieldsJsonConverter.cs +++ b/src/Nest/CommonAbstractions/Infer/Fields/FieldsJsonConverter.cs @@ -18,7 +18,7 @@ public override void WriteJson(JsonWriter writer, object value, JsonSerializer s writer.WriteStartArray(); if (fields != null) { - foreach (var field in fields?.ListOfFields) + foreach (var field in fields.ListOfFields) FieldJsonConverter.WriteField(writer, field, serializer); } writer.WriteEndArray();