From 92d170a0783bc962f52faf02acfcecbe21d3b683 Mon Sep 17 00:00:00 2001 From: James Newton-King Date: Mon, 2 Oct 2017 21:48:22 +1300 Subject: [PATCH] -Fixed converting default datetime in JSON to XML on netstandard1.3 --- .../Converters/XmlNodeConverterTest.cs | 20 +++++++++++ .../Converters/BinaryConverter.cs | 4 +-- .../Converters/BsonObjectIdConverter.cs | 3 +- .../Converters/DataTableConverter.cs | 4 +-- .../Converters/EntityKeyMemberConverter.cs | 3 +- .../Converters/IsoDateTimeConverter.cs | 11 +++---- .../Converters/JavaScriptDateTimeConverter.cs | 6 ++-- .../Converters/RegexConverter.cs | 3 +- .../Converters/XmlNodeConverter.cs | 33 ++++++++++--------- .../Utilities/DateTimeUtils.cs | 2 +- 10 files changed, 50 insertions(+), 39 deletions(-) diff --git a/Src/Newtonsoft.Json.Tests/Converters/XmlNodeConverterTest.cs b/Src/Newtonsoft.Json.Tests/Converters/XmlNodeConverterTest.cs index 46aa08c8..9d9789ba 100644 --- a/Src/Newtonsoft.Json.Tests/Converters/XmlNodeConverterTest.cs +++ b/Src/Newtonsoft.Json.Tests/Converters/XmlNodeConverterTest.cs @@ -151,6 +151,26 @@ namespace Newtonsoft.Json.Tests.Converters return sw.ToString(); } +#if !PORTABLE || NETSTANDARD1_3 || NETSTANDARD2_0 + [Test] + public void DeserializeXmlNode_DefaultDate() + { + XmlDocument xmlNode = JsonConvert.DeserializeXmlNode("{Time: \"0001-01-01T00:00:00\"}"); + + Assert.AreEqual("", xmlNode.OuterXml); + } +#endif + +#if !NET20 + [Test] + public void DeserializeXNode_DefaultDate() + { + var xmlNode = JsonConvert.DeserializeXNode("{Time: \"0001-01-01T00:00:00\"}"); + + Assert.AreEqual("", xmlNode.ToString()); + } +#endif + [Test] public void WriteJsonNull() { diff --git a/Src/Newtonsoft.Json/Converters/BinaryConverter.cs b/Src/Newtonsoft.Json/Converters/BinaryConverter.cs index 97e20d8d..83f0717b 100644 --- a/Src/Newtonsoft.Json/Converters/BinaryConverter.cs +++ b/Src/Newtonsoft.Json/Converters/BinaryConverter.cs @@ -74,9 +74,9 @@ namespace Newtonsoft.Json.Converters } #endif #if HAVE_ADO_NET - if (value is SqlBinary) + if (value is SqlBinary binary) { - return ((SqlBinary)value).Value; + return binary.Value; } #endif diff --git a/Src/Newtonsoft.Json/Converters/BsonObjectIdConverter.cs b/Src/Newtonsoft.Json/Converters/BsonObjectIdConverter.cs index 533e113d..5571c37f 100644 --- a/Src/Newtonsoft.Json/Converters/BsonObjectIdConverter.cs +++ b/Src/Newtonsoft.Json/Converters/BsonObjectIdConverter.cs @@ -46,8 +46,7 @@ namespace Newtonsoft.Json.Converters { BsonObjectId objectId = (BsonObjectId)value; - BsonWriter bsonWriter = writer as BsonWriter; - if (bsonWriter != null) + if (writer is BsonWriter bsonWriter) { bsonWriter.WriteObjectId(objectId.Value); } diff --git a/Src/Newtonsoft.Json/Converters/DataTableConverter.cs b/Src/Newtonsoft.Json/Converters/DataTableConverter.cs index ffb7af01..794a0f29 100644 --- a/Src/Newtonsoft.Json/Converters/DataTableConverter.cs +++ b/Src/Newtonsoft.Json/Converters/DataTableConverter.cs @@ -94,9 +94,7 @@ namespace Newtonsoft.Json.Converters return null; } - DataTable dt = existingValue as DataTable; - - if (dt == null) + if (!(existingValue is DataTable dt)) { // handle typed datasets dt = (objectType == typeof(DataTable)) diff --git a/Src/Newtonsoft.Json/Converters/EntityKeyMemberConverter.cs b/Src/Newtonsoft.Json/Converters/EntityKeyMemberConverter.cs index 89f9c257..aeeb87a0 100644 --- a/Src/Newtonsoft.Json/Converters/EntityKeyMemberConverter.cs +++ b/Src/Newtonsoft.Json/Converters/EntityKeyMemberConverter.cs @@ -71,8 +71,7 @@ namespace Newtonsoft.Json.Converters if (keyValueType != null) { - string valueJson; - if (JsonSerializerInternalWriter.TryConvertToString(keyValue, keyValueType, out valueJson)) + if (JsonSerializerInternalWriter.TryConvertToString(keyValue, keyValueType, out string valueJson)) { writer.WriteValue(valueJson); } diff --git a/Src/Newtonsoft.Json/Converters/IsoDateTimeConverter.cs b/Src/Newtonsoft.Json/Converters/IsoDateTimeConverter.cs index 312a8595..7f058df8 100644 --- a/Src/Newtonsoft.Json/Converters/IsoDateTimeConverter.cs +++ b/Src/Newtonsoft.Json/Converters/IsoDateTimeConverter.cs @@ -80,10 +80,8 @@ namespace Newtonsoft.Json.Converters { string text; - if (value is DateTime) + if (value is DateTime dateTime) { - DateTime dateTime = (DateTime)value; - if ((_dateTimeStyles & DateTimeStyles.AdjustToUniversal) == DateTimeStyles.AdjustToUniversal || (_dateTimeStyles & DateTimeStyles.AssumeUniversal) == DateTimeStyles.AssumeUniversal) { @@ -93,9 +91,8 @@ namespace Newtonsoft.Json.Converters text = dateTime.ToString(_dateTimeFormat ?? DefaultDateTimeFormat, Culture); } #if HAVE_DATE_TIME_OFFSET - else if (value is DateTimeOffset) + else if (value is DateTimeOffset dateTimeOffset) { - DateTimeOffset dateTimeOffset = (DateTimeOffset)value; if ((_dateTimeStyles & DateTimeStyles.AdjustToUniversal) == DateTimeStyles.AdjustToUniversal || (_dateTimeStyles & DateTimeStyles.AssumeUniversal) == DateTimeStyles.AssumeUniversal) { @@ -149,9 +146,9 @@ namespace Newtonsoft.Json.Converters } // converter is expected to return a DateTime - if (reader.Value is DateTimeOffset) + if (reader.Value is DateTimeOffset offset) { - return ((DateTimeOffset)reader.Value).DateTime; + return offset.DateTime; } #endif diff --git a/Src/Newtonsoft.Json/Converters/JavaScriptDateTimeConverter.cs b/Src/Newtonsoft.Json/Converters/JavaScriptDateTimeConverter.cs index 40b18dee..146c3ea5 100644 --- a/Src/Newtonsoft.Json/Converters/JavaScriptDateTimeConverter.cs +++ b/Src/Newtonsoft.Json/Converters/JavaScriptDateTimeConverter.cs @@ -44,16 +44,14 @@ namespace Newtonsoft.Json.Converters { long ticks; - if (value is DateTime) + if (value is DateTime dateTime) { - DateTime dateTime = (DateTime)value; DateTime utcDateTime = dateTime.ToUniversalTime(); ticks = DateTimeUtils.ConvertDateTimeToJavaScriptTicks(utcDateTime); } #if HAVE_DATE_TIME_OFFSET - else if (value is DateTimeOffset) + else if (value is DateTimeOffset dateTimeOffset) { - DateTimeOffset dateTimeOffset = (DateTimeOffset)value; DateTimeOffset utcDateTimeOffset = dateTimeOffset.ToUniversalTime(); ticks = DateTimeUtils.ConvertDateTimeToJavaScriptTicks(utcDateTimeOffset.UtcDateTime); } diff --git a/Src/Newtonsoft.Json/Converters/RegexConverter.cs b/Src/Newtonsoft.Json/Converters/RegexConverter.cs index c63e6cce..8dd20243 100644 --- a/Src/Newtonsoft.Json/Converters/RegexConverter.cs +++ b/Src/Newtonsoft.Json/Converters/RegexConverter.cs @@ -57,8 +57,7 @@ namespace Newtonsoft.Json.Converters Regex regex = (Regex)value; #pragma warning disable 618 - BsonWriter bsonWriter = writer as BsonWriter; - if (bsonWriter != null) + if (writer is BsonWriter bsonWriter) { WriteBson(bsonWriter, regex); } diff --git a/Src/Newtonsoft.Json/Converters/XmlNodeConverter.cs b/Src/Newtonsoft.Json/Converters/XmlNodeConverter.cs index 63f0a03c..4dd4f4b7 100644 --- a/Src/Newtonsoft.Json/Converters/XmlNodeConverter.cs +++ b/Src/Newtonsoft.Json/Converters/XmlNodeConverter.cs @@ -1867,40 +1867,44 @@ namespace Newtonsoft.Json.Converters return reader.Value?.ToString(); case JsonToken.Integer: #if HAVE_BIG_INTEGER - if (reader.Value is BigInteger) + if (reader.Value is BigInteger i) { - return ((BigInteger)reader.Value).ToString(CultureInfo.InvariantCulture); + return i.ToString(CultureInfo.InvariantCulture); } #endif return XmlConvert.ToString(Convert.ToInt64(reader.Value, CultureInfo.InvariantCulture)); case JsonToken.Float: - if (reader.Value is decimal) + { + if (reader.Value is decimal d) { - return XmlConvert.ToString((decimal)reader.Value); + return XmlConvert.ToString(d); } - if (reader.Value is float) + if (reader.Value is float f) { - return XmlConvert.ToString((float)reader.Value); + return XmlConvert.ToString(f); } return XmlConvert.ToString(Convert.ToDouble(reader.Value, CultureInfo.InvariantCulture)); + } case JsonToken.Boolean: return XmlConvert.ToString(Convert.ToBoolean(reader.Value, CultureInfo.InvariantCulture)); case JsonToken.Date: + { #if HAVE_DATE_TIME_OFFSET - if (reader.Value is DateTimeOffset) + if (reader.Value is DateTimeOffset offset) { - return XmlConvert.ToString((DateTimeOffset)reader.Value); + return XmlConvert.ToString(offset); } #endif DateTime d = Convert.ToDateTime(reader.Value, CultureInfo.InvariantCulture); -#if !PORTABLE +#if !PORTABLE || NETSTANDARD1_3 return XmlConvert.ToString(d, DateTimeUtils.ToSerializationMode(d.Kind)); #else - return XmlConvert.ToString(d, DateTimeUtils.ToDateTimeFormat(d.Kind)); + return d.ToString(DateTimeUtils.ToDateTimeFormat(d.Kind), CultureInfo.InvariantCulture); #endif + } case JsonToken.Bytes: return Convert.ToBase64String((byte[])reader.Value); case JsonToken.Null: @@ -1934,8 +1938,7 @@ namespace Newtonsoft.Json.Converters { foreach (IXmlNode childNode in nestedArrayElement.ChildNodes) { - IXmlElement element = childNode as IXmlElement; - if (element != null && element.LocalName == propertyName) + if (childNode is IXmlElement element && element.LocalName == propertyName) { AddJsonArrayAttribute(element, document); break; @@ -2005,8 +2008,7 @@ namespace Newtonsoft.Json.Converters attributeValue = ConvertTokenToXmlValue(reader); attributeNameValues.Add(attributeName, attributeValue); - string namespacePrefix; - if (IsNamespaceAttribute(attributeName, out namespacePrefix)) + if (IsNamespaceAttribute(attributeName, out string namespacePrefix)) { manager.AddNamespace(namespacePrefix, attributeValue); } @@ -2205,8 +2207,7 @@ namespace Newtonsoft.Json.Converters { foreach (IXmlNode childNode in currentNode.ChildNodes) { - IXmlElement element = childNode as IXmlElement; - if (element != null && element.LocalName == propertyName) + if (childNode is IXmlElement element && element.LocalName == propertyName) { AddJsonArrayAttribute(element, document); break; diff --git a/Src/Newtonsoft.Json/Utilities/DateTimeUtils.cs b/Src/Newtonsoft.Json/Utilities/DateTimeUtils.cs index 807c3a1a..19e6ce30 100644 --- a/Src/Newtonsoft.Json/Utilities/DateTimeUtils.cs +++ b/Src/Newtonsoft.Json/Utilities/DateTimeUtils.cs @@ -58,7 +58,7 @@ namespace Newtonsoft.Json.Utilities #endif } -#if !(PORTABLE40 || PORTABLE) +#if !(PORTABLE40 || PORTABLE) || NETSTANDARD1_3 public static XmlDateTimeSerializationMode ToSerializationMode(DateTimeKind kind) { switch (kind)