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