-Fix XmlNodeConverter handling of nested arrays when converting to XML
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user