-Fix XmlNodeConverter handling of nested arrays when converting to XML

This commit is contained in:
JamesNK
2009-01-11 09:01:55 +00:00
parent 663540f349
commit d1757496fb
2 changed files with 68 additions and 3 deletions
@@ -465,6 +465,52 @@ namespace Newtonsoft.Json.Tests.Converters
Assert.AreEqual(@"<myRoot><count>773840</count><photos>773840</photos></myRoot>", 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(@"<myRoot><available_sizes><available_sizes>assets/images/resized/0001/1070/11070v1-max-150x150.jpg</available_sizes><available_sizes>assets/images/resized/0001/1070/11070v1-max-150x150.jpg</available_sizes></available_sizes><available_sizes><available_sizes>assets/images/resized/0001/1070/11070v1-max-250x250.jpg</available_sizes><available_sizes>assets/images/resized/0001/1070/11070v1-max-250x250.jpg</available_sizes></available_sizes></myRoot>", 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(@"<myRoot><available_sizes><available_sizes><available_sizes>113</available_sizes><available_sizes>150</available_sizes></available_sizes><available_sizes>assets/images/resized/0001/1070/11070v1-max-150x150.jpg</available_sizes></available_sizes><available_sizes><available_sizes><available_sizes>189</available_sizes><available_sizes>250</available_sizes></available_sizes><available_sizes>assets/images/resized/0001/1070/11070v1-max-250x250.jpg</available_sizes></available_sizes><available_sizes><available_sizes><available_sizes>341</available_sizes><available_sizes>450</available_sizes></available_sizes><available_sizes>assets/images/resized/0001/1070/11070v1-max-450x450.jpg</available_sizes></available_sizes></myRoot>", newDoc.InnerXml);
}
}
}
#endif
@@ -355,6 +355,20 @@ namespace Newtonsoft.Json.Converters
string elementPrefix = GetPrefix(propertyName);
Dictionary<string, string> attributeNameValues = new Dictionary<string, string>();
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