From 663540f349fb775022bd9c5d82b18b48d47ea6bb Mon Sep 17 00:00:00 2001 From: JamesNK Date: Tue, 6 Jan 2009 09:36:04 +0000 Subject: [PATCH] -Added DeserializeNode overload to specify a root element --- .../Converters/XmlNodeConverterTest.cs | 10 ++++++++++ Src/Newtonsoft.Json.Tests/Linq/JObjectTests.cs | 1 - .../Converters/XmlNodeConverter.cs | 16 +++++++++++++++- Src/Newtonsoft.Json/JsonConvert.cs | 12 ++++++++++++ 4 files changed, 37 insertions(+), 2 deletions(-) diff --git a/Src/Newtonsoft.Json.Tests/Converters/XmlNodeConverterTest.cs b/Src/Newtonsoft.Json.Tests/Converters/XmlNodeConverterTest.cs index 8d33a679..170a00b3 100644 --- a/Src/Newtonsoft.Json.Tests/Converters/XmlNodeConverterTest.cs +++ b/Src/Newtonsoft.Json.Tests/Converters/XmlNodeConverterTest.cs @@ -455,6 +455,16 @@ namespace Newtonsoft.Json.Tests.Converters XmlDocument newDoc = (XmlDocument)JsonConvert.DeserializeXmlNode(strJSON); } + + [Test] + public void MultipleRootPropertiesAddRootElement() + { + string strJSON = @"{""count"": 773840,""photos"": 773840}"; + + XmlDocument newDoc = (XmlDocument)JsonConvert.DeserializeXmlNode(strJSON, "myRoot"); + + Assert.AreEqual(@"773840773840", newDoc.InnerXml); + } } } #endif \ No newline at end of file diff --git a/Src/Newtonsoft.Json.Tests/Linq/JObjectTests.cs b/Src/Newtonsoft.Json.Tests/Linq/JObjectTests.cs index 6153656e..60848f70 100644 --- a/Src/Newtonsoft.Json.Tests/Linq/JObjectTests.cs +++ b/Src/Newtonsoft.Json.Tests/Linq/JObjectTests.cs @@ -359,6 +359,5 @@ Parameter name: arrayIndex")] person = person; } - } } diff --git a/Src/Newtonsoft.Json/Converters/XmlNodeConverter.cs b/Src/Newtonsoft.Json/Converters/XmlNodeConverter.cs index 6a934ab8..45df035a 100644 --- a/Src/Newtonsoft.Json/Converters/XmlNodeConverter.cs +++ b/Src/Newtonsoft.Json/Converters/XmlNodeConverter.cs @@ -46,6 +46,8 @@ namespace Newtonsoft.Json.Converters private const string DeclarationName = "?xml"; private const string JsonNamespaceUri = "http://james.newtonking.com/projects/json"; + public string DeserializeRootElementName { get; set; } + #region Writing /// /// Writes the JSON representation of the object. @@ -268,12 +270,24 @@ namespace Newtonsoft.Json.Converters XmlDocument document = new XmlDocument(); XmlNamespaceManager manager = new XmlNamespaceManager(document.NameTable); + XmlNode rootNode; + + if (!string.IsNullOrEmpty(DeserializeRootElementName)) + { + rootNode = document.CreateElement(DeserializeRootElementName); + document.AppendChild(rootNode); + } + else + { + rootNode = document; + } + if (reader.TokenType != JsonToken.StartObject) throw new JsonSerializationException("XmlNodeConverter can only convert JSON that begins with an object."); reader.Read(); - DeserializeNode(reader, document, manager, document); + DeserializeNode(reader, document, manager, rootNode); return document; } diff --git a/Src/Newtonsoft.Json/JsonConvert.cs b/Src/Newtonsoft.Json/JsonConvert.cs index 2fa505f3..f0273eca 100644 --- a/Src/Newtonsoft.Json/JsonConvert.cs +++ b/Src/Newtonsoft.Json/JsonConvert.cs @@ -623,8 +623,20 @@ namespace Newtonsoft.Json /// The JSON string. /// The deserialized XmlNode public static XmlNode DeserializeXmlNode(string value) + { + return DeserializeXmlNode(value, null); + } + + /// + /// Deserializes the XmlNode from a JSON string nested in a root elment. + /// + /// The JSON string. + /// The root element name. + /// The deserialized XmlNode + public static XmlNode DeserializeXmlNode(string value, string rootElementName) { XmlNodeConverter converter = new XmlNodeConverter(); + converter.DeserializeRootElementName = rootElementName; return (XmlDocument)DeserializeObject(value, typeof(XmlDocument), converter); }