From d0d01f2a365898b86bfb424608888ac2fce51857 Mon Sep 17 00:00:00 2001 From: James Newton-King Date: Mon, 4 Dec 2017 18:53:50 +1300 Subject: [PATCH] -Fixed merging null string values --- Src/Newtonsoft.Json.Tests/Linq/MergeTests.cs | 10 ++++++++++ Src/Newtonsoft.Json/Linq/JObject.cs | 17 ++++++++++++++++- 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/Src/Newtonsoft.Json.Tests/Linq/MergeTests.cs b/Src/Newtonsoft.Json.Tests/Linq/MergeTests.cs index 3a855b59..59b8bd5c 100644 --- a/Src/Newtonsoft.Json.Tests/Linq/MergeTests.cs +++ b/Src/Newtonsoft.Json.Tests/Linq/MergeTests.cs @@ -46,6 +46,16 @@ namespace Newtonsoft.Json.Tests.Linq [TestFixture] public class MergeTests : TestFixtureBase { + [Test] + public void MergeNullString() + { + var a = new JObject { ["a"] = 1 }; + var b = new JObject { ["a"] = false ? "2" : null }; + a.Merge(b); + + Assert.AreEqual(1, (int)a["a"]); + } + [Test] public void MergeObjectProperty() { diff --git a/Src/Newtonsoft.Json/Linq/JObject.cs b/Src/Newtonsoft.Json/Linq/JObject.cs index d1092bbc..45e34f7b 100644 --- a/Src/Newtonsoft.Json/Linq/JObject.cs +++ b/Src/Newtonsoft.Json/Linq/JObject.cs @@ -185,7 +185,7 @@ namespace Newtonsoft.Json.Linq { if (!(existingProperty.Value is JContainer existingContainer) || existingContainer.Type != contentItem.Value.Type) { - if (contentItem.Value.Type != JTokenType.Null || settings?.MergeNullValueHandling == MergeNullValueHandling.Merge) + if (!IsNull(contentItem.Value) || settings?.MergeNullValueHandling == MergeNullValueHandling.Merge) { existingProperty.Value = contentItem.Value; } @@ -198,6 +198,21 @@ namespace Newtonsoft.Json.Linq } } + private static bool IsNull(JToken token) + { + if (token.Type == JTokenType.Null) + { + return true; + } + + if (token is JValue v && v.Value == null) + { + return true; + } + + return false; + } + internal void InternalPropertyChanged(JProperty childProperty) { OnPropertyChanged(childProperty.Name);