From 51212d92b1bc8b7a662220ff80873d94bfa60512 Mon Sep 17 00:00:00 2001 From: James Newton-King Date: Fri, 4 Jul 2014 17:28:36 +1200 Subject: [PATCH] -Fixed directly serializing XmlElements --- .../Converters/XmlNodeConverterTest.cs | 79 +++++++++++++++++++ .../JsonTextReaderTest.cs | 17 ++++ .../SerializationEventAttributeTests.cs | 47 +++++++++++ .../Converters/XmlNodeConverter.cs | 10 +-- 4 files changed, 148 insertions(+), 5 deletions(-) diff --git a/Src/Newtonsoft.Json.Tests/Converters/XmlNodeConverterTest.cs b/Src/Newtonsoft.Json.Tests/Converters/XmlNodeConverterTest.cs index ccd41e58..1609587f 100644 --- a/Src/Newtonsoft.Json.Tests/Converters/XmlNodeConverterTest.cs +++ b/Src/Newtonsoft.Json.Tests/Converters/XmlNodeConverterTest.cs @@ -23,6 +23,11 @@ // OTHER DEALINGS IN THE SOFTWARE. #endregion +#if NET20 +using Newtonsoft.Json.Utilities.LinqBridge; +#else +using System.Linq; +#endif using System.Text; #if !(NETFX_CORE || PORTABLE || PORTABLE40) using System; @@ -115,7 +120,81 @@ namespace Newtonsoft.Json.Tests.Converters return node; } + [Test] + public void SerializeXmlElement() + { + string xml = @" + 6 + 79 + Approved + + Someone +"; + + var xmlDocument = new XmlDocument(); + + xmlDocument.LoadXml(xml); + + var result = xmlDocument.FirstChild.ChildNodes.Cast().ToArray(); + + var json = JsonConvert.SerializeObject(result, Formatting.Indented); // <--- fails here with the cast message + + Assert.AreEqual(@"[ + { + ""Country"": ""6"" + }, + { + ""FinancialTransactionApprovalRequestUID"": ""79"" + }, + { + ""TransactionStatus"": ""Approved"" + }, + { + ""StatusChangeComment"": """" + }, + { + ""RequestedBy"": ""Someone"" + } +]", json); + } + #if !NET20 + [Test] + public void SerializeXElement() + { + string xml = @" + 6 + 79 + Approved + + Someone +"; + + var xmlDocument = XDocument.Parse(xml); + + var result = xmlDocument.Root.Nodes().ToArray(); + + var json = JsonConvert.SerializeObject(result, Formatting.Indented); // <--- fails here with the cast message + + Assert.AreEqual(@"[ + { + ""Country"": ""6"" + }, + { + ""FinancialTransactionApprovalRequestUID"": ""79"" + }, + { + ""TransactionStatus"": ""Approved"" + }, + { + ""StatusChangeComment"": """" + }, + { + ""RequestedBy"": ""Someone"" + } +]", json); + } + public class DecimalContainer { public decimal Number { get; set; } diff --git a/Src/Newtonsoft.Json.Tests/JsonTextReaderTest.cs b/Src/Newtonsoft.Json.Tests/JsonTextReaderTest.cs index 8089b632..afa3071f 100644 --- a/Src/Newtonsoft.Json.Tests/JsonTextReaderTest.cs +++ b/Src/Newtonsoft.Json.Tests/JsonTextReaderTest.cs @@ -48,6 +48,23 @@ namespace Newtonsoft.Json.Tests [TestFixture] public class JsonTextReaderTest : TestFixtureBase { + [Test] + public void ReadMultilineString() + { + string json = @"""first line +second line +third line"""; + + JsonTextReader jsonTextReader = new JsonTextReader(new StringReader(json)); + + Assert.IsTrue(jsonTextReader.Read()); + Assert.AreEqual(JsonToken.String, jsonTextReader.TokenType); + + Assert.AreEqual(@"first line +second line +third line", jsonTextReader.Value); + } + #if !(NET20 || NET35 || PORTABLE40 || PORTABLE) [Test] public void ReadBigInteger() diff --git a/Src/Newtonsoft.Json.Tests/Serialization/SerializationEventAttributeTests.cs b/Src/Newtonsoft.Json.Tests/Serialization/SerializationEventAttributeTests.cs index 536ea80b..144fe8c4 100644 --- a/Src/Newtonsoft.Json.Tests/Serialization/SerializationEventAttributeTests.cs +++ b/Src/Newtonsoft.Json.Tests/Serialization/SerializationEventAttributeTests.cs @@ -429,6 +429,23 @@ OnSerialized_Derived OnSerialized_Derived_Derived", string.Join(Environment.NewLine, e.ToArray())); } #endif + + [Test] + public void NoStreamingContextParameter() + { + ExportPostData d = new ExportPostData + { + user = "user!", + contract = new Contract + { + contractName = "name!" + } + }; + + ExceptionAssert.Throws( + "Serialization Callback 'Void Deserialized()' in type 'Newtonsoft.Json.Tests.Serialization.Contract' must have a single parameter of type 'System.Runtime.Serialization.StreamingContext'.", + () => JsonConvert.SerializeObject(d, Formatting.Indented)); + } } public class SerializationEventOrderTestObject @@ -523,4 +540,34 @@ OnSerialized_Derived_Derived", string.Join(Environment.NewLine, e.ToArray())); Events.Add("OnDeserialized_Derived_Derived"); } } + + public class ExportPostData + { + public Contract contract { get; set; } + public bool includeSubItems { get; set; } + public string user { get; set; } + public string[] projects { get; set; } + } + + public class Contract + { + public string _id { get; set; } + public string contractName { get; set; } + public string contractNumber { get; set; } + public string updatedBy { get; set; } + public DateTime updated_at { get; set; } + + private bool _onDeserializedCalled; + + public bool GetOnDeserializedCalled() + { + return _onDeserializedCalled; + } + + [OnDeserialized] + internal void Deserialized() + { + _onDeserializedCalled = true; + } + } } \ No newline at end of file diff --git a/Src/Newtonsoft.Json/Converters/XmlNodeConverter.cs b/Src/Newtonsoft.Json/Converters/XmlNodeConverter.cs index 8e8570f9..888e956a 100644 --- a/Src/Newtonsoft.Json/Converters/XmlNodeConverter.cs +++ b/Src/Newtonsoft.Json/Converters/XmlNodeConverter.cs @@ -217,7 +217,7 @@ namespace Newtonsoft.Json.Converters get { return _documentType.InternalSubset; } } - public new string LocalName + public override string LocalName { get { return "DOCTYPE"; } } @@ -243,7 +243,7 @@ namespace Newtonsoft.Json.Converters get { return _node.NodeType; } } - public string LocalName + public virtual string LocalName { get { return _node.LocalName; } } @@ -261,7 +261,7 @@ namespace Newtonsoft.Json.Converters } } - private IXmlNode WrapNode(XmlNode node) + internal static IXmlNode WrapNode(XmlNode node) { switch (node.NodeType) { @@ -445,7 +445,7 @@ namespace Newtonsoft.Json.Converters get { return _documentType.InternalSubset; } } - public new string LocalName + public override string LocalName { get { return "DOCTYPE"; } } @@ -928,7 +928,7 @@ namespace Newtonsoft.Json.Converters #endif #if !(NETFX_CORE || PORTABLE) if (value is XmlNode) - return new XmlNodeWrapper((XmlNode)value); + return XmlNodeWrapper.WrapNode((XmlNode)value); #endif throw new ArgumentException("Value must be an XML object.", "value");