From cf5692343307763c2e58cd4cb8acdf60c6c2027f Mon Sep 17 00:00:00 2001 From: Mateusz Noga-Wojtania Date: Thu, 11 Jun 2026 12:41:43 +0200 Subject: [PATCH 1/2] fix --- .../CHANGELOG.md | 4 + .../UnitTests.cs | 88 ++++++++++++++++++- .../ConvertXMLStringToJToken.cs | 8 +- ...rends.JSON.ConvertXMLStringToJToken.csproj | 6 +- 4 files changed, 101 insertions(+), 5 deletions(-) diff --git a/Frends.JSON.ConvertXMLStringToJToken/CHANGELOG.md b/Frends.JSON.ConvertXMLStringToJToken/CHANGELOG.md index 7d06d2c..d2a7c2f 100644 --- a/Frends.JSON.ConvertXMLStringToJToken/CHANGELOG.md +++ b/Frends.JSON.ConvertXMLStringToJToken/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## [2.1.0] - 2026-06-11 +### Fixed +Fix a case when we want to return null value for non-string types. + ## [2.0.0] - 2026-05-27 ### Breaking - The `XSD` parameter has moved from the **Input** tab to the **Options** tab and is now only used (and shown) when `TypeCorrection` is `Schema`. diff --git a/Frends.JSON.ConvertXMLStringToJToken/Frends.JSON.ConvertXMLStringToJToken.Tests/UnitTests.cs b/Frends.JSON.ConvertXMLStringToJToken/Frends.JSON.ConvertXMLStringToJToken.Tests/UnitTests.cs index 31b3401..8f2af9b 100644 --- a/Frends.JSON.ConvertXMLStringToJToken/Frends.JSON.ConvertXMLStringToJToken.Tests/UnitTests.cs +++ b/Frends.JSON.ConvertXMLStringToJToken/Frends.JSON.ConvertXMLStringToJToken.Tests/UnitTests.cs @@ -848,4 +848,90 @@ public void SchemaMode_WithoutXsd_ShouldNotConvertInlineXsiTypes() Assert.AreEqual(JTokenType.String, price["#text"].Type); Assert.AreEqual("12.5", price["#text"].ToString()); } -} \ No newline at end of file + + [TestMethod] + public void SchemaMode_FoobarEmptyNillableNonString_ShouldBecomeNull() + { + var input = new Input() + { + XML = @" + + + + " + }; + + var options = new Options() + { + TypeCorrection = TypeCorrectionMode.Schema, + XSD = @" + + + + + + + + + + " + }; + + var result = JSON.ConvertXMLStringToJToken(input, options); + var foobar1 = ((JObject)result.Jtoken)["root"]?["foobar1"]; + var foobar2 = ((JObject)result.Jtoken)["root"]?["foobar2"]; + var foobar3 = ((JObject)result.Jtoken)["root"]?["foobar3"]; + Assert.IsNotNull(foobar1); + Assert.IsNotNull(foobar2); + Assert.IsNotNull(foobar3); + Assert.AreEqual(JTokenType.Null, foobar1.Type); + Assert.AreEqual(JTokenType.Null, foobar2.Type); + Assert.AreEqual(JTokenType.Null, foobar3.Type); + } + + [TestMethod] + public void SchemaMode_FoobarNonString_ShouldBecomeValidType() + { + var input = new Input() + { + XML = @" + 3 + 2.3 + true + " + }; + + var options = new Options() + { + TypeCorrection = TypeCorrectionMode.Schema, + XSD = @" + + + + + + + + + + " + }; + + var result = JSON.ConvertXMLStringToJToken(input, options); + var foobar1 = ((JObject)result.Jtoken)["root"]?["foobar1"]; + var foobar2 = ((JObject)result.Jtoken)["root"]?["foobar2"]; + var foobar3 = ((JObject)result.Jtoken)["root"]?["foobar3"]; + + Assert.IsNotNull(foobar1); + Assert.IsNotNull(foobar2); + Assert.IsNotNull(foobar3); + + Assert.AreEqual(JTokenType.Integer, foobar1.Type); + Assert.AreEqual(JTokenType.Float, foobar2.Type); + Assert.AreEqual(JTokenType.Boolean, foobar3.Type); + + Assert.AreEqual(3, foobar1.Value()); + Assert.AreEqual(2.3, foobar2.Value()); + Assert.AreEqual(true, foobar3.Value()); + } +} diff --git a/Frends.JSON.ConvertXMLStringToJToken/Frends.JSON.ConvertXMLStringToJToken/ConvertXMLStringToJToken.cs b/Frends.JSON.ConvertXMLStringToJToken/Frends.JSON.ConvertXMLStringToJToken/ConvertXMLStringToJToken.cs index 64a6af9..c9c2d6c 100644 --- a/Frends.JSON.ConvertXMLStringToJToken/Frends.JSON.ConvertXMLStringToJToken/ConvertXMLStringToJToken.cs +++ b/Frends.JSON.ConvertXMLStringToJToken/Frends.JSON.ConvertXMLStringToJToken/ConvertXMLStringToJToken.cs @@ -431,7 +431,13 @@ private static bool ApplyXsiNil( if (nilFlag == true) { nilProperty.Remove(); - ReplaceOrClearWrapper(obj, textProperty, JValue.CreateNull()); + var typePropertyForNil = FindXsiTypeProperty(obj, xmlnsScope); + typePropertyForNil?.Remove(); + + if (obj.Parent != null) + obj.Replace(JValue.CreateNull()); + else + ReplaceOrClearWrapper(obj, textProperty, JValue.CreateNull()); return true; } diff --git a/Frends.JSON.ConvertXMLStringToJToken/Frends.JSON.ConvertXMLStringToJToken/Frends.JSON.ConvertXMLStringToJToken.csproj b/Frends.JSON.ConvertXMLStringToJToken/Frends.JSON.ConvertXMLStringToJToken/Frends.JSON.ConvertXMLStringToJToken.csproj index feb23d9..2384cd4 100644 --- a/Frends.JSON.ConvertXMLStringToJToken/Frends.JSON.ConvertXMLStringToJToken/Frends.JSON.ConvertXMLStringToJToken.csproj +++ b/Frends.JSON.ConvertXMLStringToJToken/Frends.JSON.ConvertXMLStringToJToken/Frends.JSON.ConvertXMLStringToJToken.csproj @@ -2,7 +2,7 @@ net6.0 - 2.0.0 + 2.1.0 Frends Frends Frends @@ -14,7 +14,7 @@ https://frends.com/ https://github.com/FrendsPlatform/Frends.JSON2/tree/main/Frends.JSON.ConvertXMLStringToJToken - + PreserveNewest @@ -22,7 +22,7 @@ - + From b1114a3d185980f2130a119a2af4197f562b04ad Mon Sep 17 00:00:00 2001 From: Mateusz Noga-Wojtania Date: Thu, 11 Jun 2026 13:32:41 +0200 Subject: [PATCH 2/2] typo --- Frends.JSON.ConvertXMLStringToJToken/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Frends.JSON.ConvertXMLStringToJToken/CHANGELOG.md b/Frends.JSON.ConvertXMLStringToJToken/CHANGELOG.md index d2a7c2f..f5b316c 100644 --- a/Frends.JSON.ConvertXMLStringToJToken/CHANGELOG.md +++ b/Frends.JSON.ConvertXMLStringToJToken/CHANGELOG.md @@ -2,7 +2,7 @@ ## [2.1.0] - 2026-06-11 ### Fixed -Fix a case when we want to return null value for non-string types. +- Fix a case when we want to return null value for non-string types. ## [2.0.0] - 2026-05-27 ### Breaking