-Fixed converting default datetime in JSON to XML on netstandard1.3
This commit is contained in:
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user