From 4d425ccd06a834414db0efd13a1beb149258bfe4 Mon Sep 17 00:00:00 2001 From: James Newton-King Date: Thu, 8 Dec 2016 09:47:01 +1300 Subject: [PATCH] -Fix merging null with complex type and MergeNullValueHandling.Ignore --- Src/Newtonsoft.Json.Tests/Linq/MergeTests.cs | 65 ++++++++++++++++++++ Src/Newtonsoft.Json/Linq/JObject.cs | 6 +- 2 files changed, 66 insertions(+), 5 deletions(-) diff --git a/Src/Newtonsoft.Json.Tests/Linq/MergeTests.cs b/Src/Newtonsoft.Json.Tests/Linq/MergeTests.cs index 9005d69f..378df80b 100644 --- a/Src/Newtonsoft.Json.Tests/Linq/MergeTests.cs +++ b/Src/Newtonsoft.Json.Tests/Linq/MergeTests.cs @@ -596,5 +596,70 @@ namespace Newtonsoft.Json.Tests.Linq Assert.IsNotNull(source["Property5"]); Assert.AreEqual(JTokenType.Null, source["Property5"].Type); } + + [Test] + public void MergeNullValueHandling_Array() + { + string originalJson = @"{ + ""Bar"": [ + ""a"", + ""b"", + ""c"" + ] +}"; + string newJson = @"{ + ""Bar"": null +}"; + + JObject oldFoo = JObject.Parse(originalJson); + JObject newFoo = JObject.Parse(newJson); + + oldFoo.Merge(newFoo, new JsonMergeSettings + { + MergeNullValueHandling = MergeNullValueHandling.Ignore + }); + + StringAssert.AreEqual(originalJson, oldFoo.ToString()); + + oldFoo.Merge(newFoo, new JsonMergeSettings + { + MergeNullValueHandling = MergeNullValueHandling.Merge + }); + + StringAssert.AreEqual(newJson, newFoo.ToString()); + } + + [Test] + public void MergeNullValueHandling_Object() + { + string originalJson = @"{ + ""Bar"": {} +}"; + string newJson = @"{ + ""Bar"": null +}"; + + JObject oldFoo = JObject.Parse(originalJson); + JObject newFoo = JObject.Parse(newJson); + + oldFoo.Merge(newFoo, new JsonMergeSettings + { + MergeNullValueHandling = MergeNullValueHandling.Ignore + }); + + StringAssert.AreEqual(originalJson, oldFoo.ToString()); + + oldFoo.Merge(newFoo, new JsonMergeSettings + { + MergeNullValueHandling = MergeNullValueHandling.Merge + }); + + StringAssert.AreEqual(newJson, newFoo.ToString()); + } + + public class Foo + { + public IEnumerable Bar { get; set; } + } } } \ No newline at end of file diff --git a/Src/Newtonsoft.Json/Linq/JObject.cs b/Src/Newtonsoft.Json/Linq/JObject.cs index 55e13d75..b9098ab1 100644 --- a/Src/Newtonsoft.Json/Linq/JObject.cs +++ b/Src/Newtonsoft.Json/Linq/JObject.cs @@ -190,17 +190,13 @@ namespace Newtonsoft.Json.Linq else if (contentItem.Value != null) { JContainer existingContainer = existingProperty.Value as JContainer; - if (existingContainer == null) + if (existingContainer == null || existingContainer.Type != contentItem.Value.Type) { if (contentItem.Value.Type != JTokenType.Null || settings?.MergeNullValueHandling == MergeNullValueHandling.Merge) { existingProperty.Value = contentItem.Value; } } - else if (existingContainer.Type != contentItem.Value.Type) - { - existingProperty.Value = contentItem.Value; - } else { existingContainer.Merge(contentItem.Value, settings);