-Fixed converting default datetime in JSON to XML on netstandard1.3

This commit is contained in:
James Newton-King
2017-10-02 21:48:22 +13:00
parent 8f65999684
commit 92d170a078
10 changed files with 50 additions and 39 deletions
@@ -151,6 +151,26 @@ namespace Newtonsoft.Json.Tests.Converters
return sw.ToString(); 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("<Time>0001-01-01T00:00:00</Time>", xmlNode.OuterXml);
}
#endif
#if !NET20
[Test]
public void DeserializeXNode_DefaultDate()
{
var xmlNode = JsonConvert.DeserializeXNode("{Time: \"0001-01-01T00:00:00\"}");
Assert.AreEqual("<Time>0001-01-01T00:00:00</Time>", xmlNode.ToString());
}
#endif
[Test] [Test]
public void WriteJsonNull() public void WriteJsonNull()
{ {
@@ -74,9 +74,9 @@ namespace Newtonsoft.Json.Converters
} }
#endif #endif
#if HAVE_ADO_NET #if HAVE_ADO_NET
if (value is SqlBinary) if (value is SqlBinary binary)
{ {
return ((SqlBinary)value).Value; return binary.Value;
} }
#endif #endif
@@ -46,8 +46,7 @@ namespace Newtonsoft.Json.Converters
{ {
BsonObjectId objectId = (BsonObjectId)value; BsonObjectId objectId = (BsonObjectId)value;
BsonWriter bsonWriter = writer as BsonWriter; if (writer is BsonWriter bsonWriter)
if (bsonWriter != null)
{ {
bsonWriter.WriteObjectId(objectId.Value); bsonWriter.WriteObjectId(objectId.Value);
} }
@@ -94,9 +94,7 @@ namespace Newtonsoft.Json.Converters
return null; return null;
} }
DataTable dt = existingValue as DataTable; if (!(existingValue is DataTable dt))
if (dt == null)
{ {
// handle typed datasets // handle typed datasets
dt = (objectType == typeof(DataTable)) dt = (objectType == typeof(DataTable))
@@ -71,8 +71,7 @@ namespace Newtonsoft.Json.Converters
if (keyValueType != null) if (keyValueType != null)
{ {
string valueJson; if (JsonSerializerInternalWriter.TryConvertToString(keyValue, keyValueType, out string valueJson))
if (JsonSerializerInternalWriter.TryConvertToString(keyValue, keyValueType, out valueJson))
{ {
writer.WriteValue(valueJson); writer.WriteValue(valueJson);
} }
@@ -80,10 +80,8 @@ namespace Newtonsoft.Json.Converters
{ {
string text; string text;
if (value is DateTime) if (value is DateTime dateTime)
{ {
DateTime dateTime = (DateTime)value;
if ((_dateTimeStyles & DateTimeStyles.AdjustToUniversal) == DateTimeStyles.AdjustToUniversal if ((_dateTimeStyles & DateTimeStyles.AdjustToUniversal) == DateTimeStyles.AdjustToUniversal
|| (_dateTimeStyles & DateTimeStyles.AssumeUniversal) == DateTimeStyles.AssumeUniversal) || (_dateTimeStyles & DateTimeStyles.AssumeUniversal) == DateTimeStyles.AssumeUniversal)
{ {
@@ -93,9 +91,8 @@ namespace Newtonsoft.Json.Converters
text = dateTime.ToString(_dateTimeFormat ?? DefaultDateTimeFormat, Culture); text = dateTime.ToString(_dateTimeFormat ?? DefaultDateTimeFormat, Culture);
} }
#if HAVE_DATE_TIME_OFFSET #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 if ((_dateTimeStyles & DateTimeStyles.AdjustToUniversal) == DateTimeStyles.AdjustToUniversal
|| (_dateTimeStyles & DateTimeStyles.AssumeUniversal) == DateTimeStyles.AssumeUniversal) || (_dateTimeStyles & DateTimeStyles.AssumeUniversal) == DateTimeStyles.AssumeUniversal)
{ {
@@ -149,9 +146,9 @@ namespace Newtonsoft.Json.Converters
} }
// converter is expected to return a DateTime // 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 #endif
@@ -44,16 +44,14 @@ namespace Newtonsoft.Json.Converters
{ {
long ticks; long ticks;
if (value is DateTime) if (value is DateTime dateTime)
{ {
DateTime dateTime = (DateTime)value;
DateTime utcDateTime = dateTime.ToUniversalTime(); DateTime utcDateTime = dateTime.ToUniversalTime();
ticks = DateTimeUtils.ConvertDateTimeToJavaScriptTicks(utcDateTime); ticks = DateTimeUtils.ConvertDateTimeToJavaScriptTicks(utcDateTime);
} }
#if HAVE_DATE_TIME_OFFSET #if HAVE_DATE_TIME_OFFSET
else if (value is DateTimeOffset) else if (value is DateTimeOffset dateTimeOffset)
{ {
DateTimeOffset dateTimeOffset = (DateTimeOffset)value;
DateTimeOffset utcDateTimeOffset = dateTimeOffset.ToUniversalTime(); DateTimeOffset utcDateTimeOffset = dateTimeOffset.ToUniversalTime();
ticks = DateTimeUtils.ConvertDateTimeToJavaScriptTicks(utcDateTimeOffset.UtcDateTime); ticks = DateTimeUtils.ConvertDateTimeToJavaScriptTicks(utcDateTimeOffset.UtcDateTime);
} }
@@ -57,8 +57,7 @@ namespace Newtonsoft.Json.Converters
Regex regex = (Regex)value; Regex regex = (Regex)value;
#pragma warning disable 618 #pragma warning disable 618
BsonWriter bsonWriter = writer as BsonWriter; if (writer is BsonWriter bsonWriter)
if (bsonWriter != null)
{ {
WriteBson(bsonWriter, regex); WriteBson(bsonWriter, regex);
} }
@@ -1867,40 +1867,44 @@ namespace Newtonsoft.Json.Converters
return reader.Value?.ToString(); return reader.Value?.ToString();
case JsonToken.Integer: case JsonToken.Integer:
#if HAVE_BIG_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 #endif
return XmlConvert.ToString(Convert.ToInt64(reader.Value, CultureInfo.InvariantCulture)); return XmlConvert.ToString(Convert.ToInt64(reader.Value, CultureInfo.InvariantCulture));
case JsonToken.Float: 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)); return XmlConvert.ToString(Convert.ToDouble(reader.Value, CultureInfo.InvariantCulture));
}
case JsonToken.Boolean: case JsonToken.Boolean:
return XmlConvert.ToString(Convert.ToBoolean(reader.Value, CultureInfo.InvariantCulture)); return XmlConvert.ToString(Convert.ToBoolean(reader.Value, CultureInfo.InvariantCulture));
case JsonToken.Date: case JsonToken.Date:
{
#if HAVE_DATE_TIME_OFFSET #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 #endif
DateTime d = Convert.ToDateTime(reader.Value, CultureInfo.InvariantCulture); DateTime d = Convert.ToDateTime(reader.Value, CultureInfo.InvariantCulture);
#if !PORTABLE #if !PORTABLE || NETSTANDARD1_3
return XmlConvert.ToString(d, DateTimeUtils.ToSerializationMode(d.Kind)); return XmlConvert.ToString(d, DateTimeUtils.ToSerializationMode(d.Kind));
#else #else
return XmlConvert.ToString(d, DateTimeUtils.ToDateTimeFormat(d.Kind)); return d.ToString(DateTimeUtils.ToDateTimeFormat(d.Kind), CultureInfo.InvariantCulture);
#endif #endif
}
case JsonToken.Bytes: case JsonToken.Bytes:
return Convert.ToBase64String((byte[])reader.Value); return Convert.ToBase64String((byte[])reader.Value);
case JsonToken.Null: case JsonToken.Null:
@@ -1934,8 +1938,7 @@ namespace Newtonsoft.Json.Converters
{ {
foreach (IXmlNode childNode in nestedArrayElement.ChildNodes) foreach (IXmlNode childNode in nestedArrayElement.ChildNodes)
{ {
IXmlElement element = childNode as IXmlElement; if (childNode is IXmlElement element && element.LocalName == propertyName)
if (element != null && element.LocalName == propertyName)
{ {
AddJsonArrayAttribute(element, document); AddJsonArrayAttribute(element, document);
break; break;
@@ -2005,8 +2008,7 @@ namespace Newtonsoft.Json.Converters
attributeValue = ConvertTokenToXmlValue(reader); attributeValue = ConvertTokenToXmlValue(reader);
attributeNameValues.Add(attributeName, attributeValue); attributeNameValues.Add(attributeName, attributeValue);
string namespacePrefix; if (IsNamespaceAttribute(attributeName, out string namespacePrefix))
if (IsNamespaceAttribute(attributeName, out namespacePrefix))
{ {
manager.AddNamespace(namespacePrefix, attributeValue); manager.AddNamespace(namespacePrefix, attributeValue);
} }
@@ -2205,8 +2207,7 @@ namespace Newtonsoft.Json.Converters
{ {
foreach (IXmlNode childNode in currentNode.ChildNodes) foreach (IXmlNode childNode in currentNode.ChildNodes)
{ {
IXmlElement element = childNode as IXmlElement; if (childNode is IXmlElement element && element.LocalName == propertyName)
if (element != null && element.LocalName == propertyName)
{ {
AddJsonArrayAttribute(element, document); AddJsonArrayAttribute(element, document);
break; break;
@@ -58,7 +58,7 @@ namespace Newtonsoft.Json.Utilities
#endif #endif
} }
#if !(PORTABLE40 || PORTABLE) #if !(PORTABLE40 || PORTABLE) || NETSTANDARD1_3
public static XmlDateTimeSerializationMode ToSerializationMode(DateTimeKind kind) public static XmlDateTimeSerializationMode ToSerializationMode(DateTimeKind kind)
{ {
switch (kind) switch (kind)