diff --git a/Frends.JSON.ConvertXMLStringToJToken/CHANGELOG.md b/Frends.JSON.ConvertXMLStringToJToken/CHANGELOG.md index 20be4d0..6b771fb 100644 --- a/Frends.JSON.ConvertXMLStringToJToken/CHANGELOG.md +++ b/Frends.JSON.ConvertXMLStringToJToken/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## [1.2.0] - 2025-01-13 +### Added +- Added ConvertAsArrayPaths parameter that specify which XML elements should be converted to arrays. + ## [1.1.0] - 2024-08-20 ### Updated - Updated Newtonsoft.Json library to the latest version 13.0.3. diff --git a/Frends.JSON.ConvertXMLStringToJToken/Frends.JSON.ConvertXMLStringToJToken.Tests/UnitTests.cs b/Frends.JSON.ConvertXMLStringToJToken/Frends.JSON.ConvertXMLStringToJToken.Tests/UnitTests.cs index 77a4a9a..2591372 100644 --- a/Frends.JSON.ConvertXMLStringToJToken/Frends.JSON.ConvertXMLStringToJToken.Tests/UnitTests.cs +++ b/Frends.JSON.ConvertXMLStringToJToken/Frends.JSON.ConvertXMLStringToJToken.Tests/UnitTests.cs @@ -29,4 +29,30 @@ public void ShouldConvertXmlStringToJToken() Assert.IsTrue(result.Success); Assert.IsInstanceOfType(result.Jtoken, typeof(JObject)); } + + [TestMethod] + public void ConvertXMLStringToJToken_WithConvertAsArrayPaths_ShouldTreatSingleItemsAsArrays() + { + var input = new Input() + { + XML = @" + + item1 + + + category1 + + ", + ConvertAsArrayPaths = new[] { "$.root.items.item" } + }; + var result = JSON.ConvertXMLStringToJToken(input); + + Assert.IsTrue(result.Success); + + Assert.AreEqual(result.Jtoken["root"]["items"]["item"].Type, JTokenType.Array); + Assert.AreEqual(result.Jtoken["root"]["items"]["item"][0].ToString(), "item1"); + + Assert.AreEqual(result.Jtoken["root"]["categories"]["category"].Type, JTokenType.String); + Assert.AreEqual(result.Jtoken["root"]["categories"]["category"].ToString(), "category1"); + } } \ No newline at end of file diff --git a/Frends.JSON.ConvertXMLStringToJToken/Frends.JSON.ConvertXMLStringToJToken/ConvertXMLStringToJToken.cs b/Frends.JSON.ConvertXMLStringToJToken/Frends.JSON.ConvertXMLStringToJToken/ConvertXMLStringToJToken.cs index d03892e..6368283 100644 --- a/Frends.JSON.ConvertXMLStringToJToken/Frends.JSON.ConvertXMLStringToJToken/ConvertXMLStringToJToken.cs +++ b/Frends.JSON.ConvertXMLStringToJToken/Frends.JSON.ConvertXMLStringToJToken/ConvertXMLStringToJToken.cs @@ -2,6 +2,7 @@ using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System.ComponentModel; +using System.Linq; using System.Xml; namespace Frends.JSON.ConvertXMLStringToJToken; @@ -22,6 +23,25 @@ public static Result ConvertXMLStringToJToken([PropertyTab] Input input) var doc = new XmlDocument(); doc.LoadXml(input.XML); var jsonString = JsonConvert.SerializeXmlNode(doc); - return new Result(true, JToken.Parse(jsonString)); + var jToken = JToken.Parse(jsonString); + + if (input.ConvertAsArrayPaths != null && input.ConvertAsArrayPaths.Length > 0) + { + foreach (var path in input.ConvertAsArrayPaths) + { + var matchingTokens = jToken.SelectTokens(path).ToList(); + + foreach (var token in matchingTokens) + { + if (token.Type != JTokenType.Array) + { + var array = new JArray(token); + token.Replace(array); + } + } + } + } + + return new Result(true, jToken); } } \ No newline at end of file diff --git a/Frends.JSON.ConvertXMLStringToJToken/Frends.JSON.ConvertXMLStringToJToken/Definitions/Input.cs b/Frends.JSON.ConvertXMLStringToJToken/Frends.JSON.ConvertXMLStringToJToken/Definitions/Input.cs index bb92971..0489f4b 100644 --- a/Frends.JSON.ConvertXMLStringToJToken/Frends.JSON.ConvertXMLStringToJToken/Definitions/Input.cs +++ b/Frends.JSON.ConvertXMLStringToJToken/Frends.JSON.ConvertXMLStringToJToken/Definitions/Input.cs @@ -10,4 +10,12 @@ public class Input /// /// <?xml version='1.0' standalone='no'?><root><foos id = '1' ><foo>bar</name></foos></root> public string XML { get; set; } + + /// + /// A list of JSONPath expressions that specify which JSON elements should always be converted to arrays. + /// + /// + /// new[] { "$.root.items.item" } + /// + public string[] ConvertAsArrayPaths { get; set; } } \ No newline at end of file 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 6a0ddfb..06714cc 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 - 1.1.0 + 1.2.0 Frends Frends Frends