From d1757496fb57b50ee1ab4dab002c8426f205a0d0 Mon Sep 17 00:00:00 2001 From: JamesNK Date: Sun, 11 Jan 2009 09:01:55 +0000 Subject: [PATCH] -Fix XmlNodeConverter handling of nested arrays when converting to XML --- .../Converters/XmlNodeConverterTest.cs | 46 +++++++++++++++++++ .../Converters/XmlNodeConverter.cs | 25 ++++++++-- 2 files changed, 68 insertions(+), 3 deletions(-) diff --git a/Src/Newtonsoft.Json.Tests/Converters/XmlNodeConverterTest.cs b/Src/Newtonsoft.Json.Tests/Converters/XmlNodeConverterTest.cs index 170a00b3..94587de7 100644 --- a/Src/Newtonsoft.Json.Tests/Converters/XmlNodeConverterTest.cs +++ b/Src/Newtonsoft.Json.Tests/Converters/XmlNodeConverterTest.cs @@ -465,6 +465,52 @@ namespace Newtonsoft.Json.Tests.Converters Assert.AreEqual(@"773840773840", newDoc.InnerXml); } + + [Test] + public void NestedArrays() + { + string json = @"{ + ""available_sizes"": [ + [ + ""assets/images/resized/0001/1070/11070v1-max-150x150.jpg"", + ""assets/images/resized/0001/1070/11070v1-max-150x150.jpg"" + ], + [ + ""assets/images/resized/0001/1070/11070v1-max-250x250.jpg"", + ""assets/images/resized/0001/1070/11070v1-max-250x250.jpg"" + ] + ] +}"; + + XmlDocument newDoc = (XmlDocument)JsonConvert.DeserializeXmlNode(json, "myRoot"); + + Assert.AreEqual(@"assets/images/resized/0001/1070/11070v1-max-150x150.jpgassets/images/resized/0001/1070/11070v1-max-150x150.jpgassets/images/resized/0001/1070/11070v1-max-250x250.jpgassets/images/resized/0001/1070/11070v1-max-250x250.jpg", newDoc.InnerXml); + } + + [Test] + public void MultipleNestedArraysToXml() + { + string json = @"{ + ""available_sizes"": [ + [ + [113, 150], + ""assets/images/resized/0001/1070/11070v1-max-150x150.jpg"" + ], + [ + [189, 250], + ""assets/images/resized/0001/1070/11070v1-max-250x250.jpg"" + ], + [ + [341, 450], + ""assets/images/resized/0001/1070/11070v1-max-450x450.jpg"" + ] + ] +}"; + + XmlDocument newDoc = (XmlDocument)JsonConvert.DeserializeXmlNode(json, "myRoot"); + + Assert.AreEqual(@"113150assets/images/resized/0001/1070/11070v1-max-150x150.jpg189250assets/images/resized/0001/1070/11070v1-max-250x250.jpg341450assets/images/resized/0001/1070/11070v1-max-450x450.jpg", newDoc.InnerXml); + } } } #endif \ No newline at end of file diff --git a/Src/Newtonsoft.Json/Converters/XmlNodeConverter.cs b/Src/Newtonsoft.Json/Converters/XmlNodeConverter.cs index 45df035a..a763a7a5 100644 --- a/Src/Newtonsoft.Json/Converters/XmlNodeConverter.cs +++ b/Src/Newtonsoft.Json/Converters/XmlNodeConverter.cs @@ -355,6 +355,20 @@ namespace Newtonsoft.Json.Converters string elementPrefix = GetPrefix(propertyName); Dictionary attributeNameValues = new Dictionary(); + if (reader.TokenType == JsonToken.StartArray) + { + XmlElement nestedArrayElement = CreateElement(propertyName, document, elementPrefix, manager); + + currentNode.AppendChild(nestedArrayElement); + + while (reader.Read() && reader.TokenType != JsonToken.EndArray) + { + DeserializeValue(reader, document, manager, propertyName, nestedArrayElement); + } + + return; + } + // a string token means the element only has a single text child if (reader.TokenType != JsonToken.String && reader.TokenType != JsonToken.Null @@ -402,9 +416,7 @@ namespace Newtonsoft.Json.Converters // have to wait until attributes have been parsed before creating element // attributes may contain namespace info used by the element - XmlElement element = (!string.IsNullOrEmpty(elementPrefix)) - ? document.CreateElement(propertyName, manager.LookupNamespace(elementPrefix)) - : document.CreateElement(propertyName); + XmlElement element = CreateElement(propertyName, document, elementPrefix, manager); currentNode.AppendChild(element); @@ -464,6 +476,13 @@ namespace Newtonsoft.Json.Converters } } + private XmlElement CreateElement(string elementName, XmlDocument document, string elementPrefix, XmlNamespaceManager manager) + { + return (!string.IsNullOrEmpty(elementPrefix)) + ? document.CreateElement(elementName, manager.LookupNamespace(elementPrefix)) + : document.CreateElement(elementName); + } + private void DeserializeNode(JsonReader reader, XmlDocument document, XmlNamespaceManager manager, XmlNode currentNode) { do