-Refactored parsing dates
-Refactored writing integers -Refactored JsonConvert
This commit is contained in:
@@ -225,17 +225,17 @@ now brown cow?", '"', true);
|
||||
value = (ulong)1;
|
||||
Assert.AreEqual("1", JsonConvert.ToString(value));
|
||||
|
||||
value = new DateTime(JsonConvert.InitialJavaScriptDateTicks, DateTimeKind.Utc);
|
||||
value = new DateTime(DateTimeUtils.InitialJavaScriptDateTicks, DateTimeKind.Utc);
|
||||
Assert.AreEqual(@"""1970-01-01T00:00:00Z""", JsonConvert.ToString(value));
|
||||
|
||||
value = new DateTime(JsonConvert.InitialJavaScriptDateTicks, DateTimeKind.Utc);
|
||||
value = new DateTime(DateTimeUtils.InitialJavaScriptDateTicks, DateTimeKind.Utc);
|
||||
Assert.AreEqual(@"""\/Date(0)\/""", JsonConvert.ToString((DateTime)value, DateFormatHandling.MicrosoftDateFormat, DateTimeZoneHandling.RoundtripKind));
|
||||
|
||||
#if !NET20
|
||||
value = new DateTimeOffset(JsonConvert.InitialJavaScriptDateTicks, TimeSpan.Zero);
|
||||
value = new DateTimeOffset(DateTimeUtils.InitialJavaScriptDateTicks, TimeSpan.Zero);
|
||||
Assert.AreEqual(@"""1970-01-01T00:00:00+00:00""", JsonConvert.ToString(value));
|
||||
|
||||
value = new DateTimeOffset(JsonConvert.InitialJavaScriptDateTicks, TimeSpan.Zero);
|
||||
value = new DateTimeOffset(DateTimeUtils.InitialJavaScriptDateTicks, TimeSpan.Zero);
|
||||
Assert.AreEqual(@"""\/Date(0+0000)\/""", JsonConvert.ToString((DateTimeOffset)value, DateFormatHandling.MicrosoftDateFormat));
|
||||
#endif
|
||||
|
||||
@@ -366,10 +366,10 @@ now brown cow?", '"', true);
|
||||
Assert.AreEqual("2000-01-01T01:01:01" + GetOffset(year2000local, DateFormatHandling.IsoDateFormat), result.IsoDateLocal);
|
||||
Assert.AreEqual("2000-01-01T01:01:01", result.IsoDateUnspecified);
|
||||
Assert.AreEqual(localToUtcDate, result.IsoDateUtc);
|
||||
Assert.AreEqual(@"\/Date(" + JsonConvert.ConvertDateTimeToJavaScriptTicks(year2000local) + GetOffset(year2000local, DateFormatHandling.MicrosoftDateFormat) + @")\/", result.MsDateRoundtrip);
|
||||
Assert.AreEqual(@"\/Date(" + JsonConvert.ConvertDateTimeToJavaScriptTicks(year2000local) + GetOffset(year2000local, DateFormatHandling.MicrosoftDateFormat) + @")\/", result.MsDateLocal);
|
||||
Assert.AreEqual(@"\/Date(" + JsonConvert.ConvertDateTimeToJavaScriptTicks(year2000local) + GetOffset(year2000local, DateFormatHandling.MicrosoftDateFormat) + @")\/", result.MsDateUnspecified);
|
||||
Assert.AreEqual(@"\/Date(" + JsonConvert.ConvertDateTimeToJavaScriptTicks(year2000local) + @")\/", result.MsDateUtc);
|
||||
Assert.AreEqual(@"\/Date(" + DateTimeUtils.ConvertDateTimeToJavaScriptTicks(year2000local) + GetOffset(year2000local, DateFormatHandling.MicrosoftDateFormat) + @")\/", result.MsDateRoundtrip);
|
||||
Assert.AreEqual(@"\/Date(" + DateTimeUtils.ConvertDateTimeToJavaScriptTicks(year2000local) + GetOffset(year2000local, DateFormatHandling.MicrosoftDateFormat) + @")\/", result.MsDateLocal);
|
||||
Assert.AreEqual(@"\/Date(" + DateTimeUtils.ConvertDateTimeToJavaScriptTicks(year2000local) + GetOffset(year2000local, DateFormatHandling.MicrosoftDateFormat) + @")\/", result.MsDateUnspecified);
|
||||
Assert.AreEqual(@"\/Date(" + DateTimeUtils.ConvertDateTimeToJavaScriptTicks(year2000local) + @")\/", result.MsDateUtc);
|
||||
|
||||
DateTime millisecondsLocal = new DateTime(2000, 1, 1, 1, 1, 1, 999, DateTimeKind.Local);
|
||||
localToUtcDate = millisecondsLocal.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ss.FFFFFFFK");
|
||||
@@ -379,10 +379,10 @@ now brown cow?", '"', true);
|
||||
Assert.AreEqual("2000-01-01T01:01:01.999" + GetOffset(millisecondsLocal, DateFormatHandling.IsoDateFormat), result.IsoDateLocal);
|
||||
Assert.AreEqual("2000-01-01T01:01:01.999", result.IsoDateUnspecified);
|
||||
Assert.AreEqual(localToUtcDate, result.IsoDateUtc);
|
||||
Assert.AreEqual(@"\/Date(" + JsonConvert.ConvertDateTimeToJavaScriptTicks(millisecondsLocal) + GetOffset(millisecondsLocal, DateFormatHandling.MicrosoftDateFormat) + @")\/", result.MsDateRoundtrip);
|
||||
Assert.AreEqual(@"\/Date(" + JsonConvert.ConvertDateTimeToJavaScriptTicks(millisecondsLocal) + GetOffset(millisecondsLocal, DateFormatHandling.MicrosoftDateFormat) + @")\/", result.MsDateLocal);
|
||||
Assert.AreEqual(@"\/Date(" + JsonConvert.ConvertDateTimeToJavaScriptTicks(millisecondsLocal) + GetOffset(millisecondsLocal, DateFormatHandling.MicrosoftDateFormat) + @")\/", result.MsDateUnspecified);
|
||||
Assert.AreEqual(@"\/Date(" + JsonConvert.ConvertDateTimeToJavaScriptTicks(millisecondsLocal) + @")\/", result.MsDateUtc);
|
||||
Assert.AreEqual(@"\/Date(" + DateTimeUtils.ConvertDateTimeToJavaScriptTicks(millisecondsLocal) + GetOffset(millisecondsLocal, DateFormatHandling.MicrosoftDateFormat) + @")\/", result.MsDateRoundtrip);
|
||||
Assert.AreEqual(@"\/Date(" + DateTimeUtils.ConvertDateTimeToJavaScriptTicks(millisecondsLocal) + GetOffset(millisecondsLocal, DateFormatHandling.MicrosoftDateFormat) + @")\/", result.MsDateLocal);
|
||||
Assert.AreEqual(@"\/Date(" + DateTimeUtils.ConvertDateTimeToJavaScriptTicks(millisecondsLocal) + GetOffset(millisecondsLocal, DateFormatHandling.MicrosoftDateFormat) + @")\/", result.MsDateUnspecified);
|
||||
Assert.AreEqual(@"\/Date(" + DateTimeUtils.ConvertDateTimeToJavaScriptTicks(millisecondsLocal) + @")\/", result.MsDateUtc);
|
||||
|
||||
DateTime ticksLocal = new DateTime(634663873826822481, DateTimeKind.Local);
|
||||
localToUtcDate = ticksLocal.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ss.FFFFFFFK");
|
||||
@@ -392,10 +392,10 @@ now brown cow?", '"', true);
|
||||
Assert.AreEqual("2012-03-03T16:03:02.6822481" + GetOffset(ticksLocal, DateFormatHandling.IsoDateFormat), result.IsoDateLocal);
|
||||
Assert.AreEqual("2012-03-03T16:03:02.6822481", result.IsoDateUnspecified);
|
||||
Assert.AreEqual(localToUtcDate, result.IsoDateUtc);
|
||||
Assert.AreEqual(@"\/Date(" + JsonConvert.ConvertDateTimeToJavaScriptTicks(ticksLocal) + GetOffset(ticksLocal, DateFormatHandling.MicrosoftDateFormat) + @")\/", result.MsDateRoundtrip);
|
||||
Assert.AreEqual(@"\/Date(" + JsonConvert.ConvertDateTimeToJavaScriptTicks(ticksLocal) + GetOffset(ticksLocal, DateFormatHandling.MicrosoftDateFormat) + @")\/", result.MsDateLocal);
|
||||
Assert.AreEqual(@"\/Date(" + JsonConvert.ConvertDateTimeToJavaScriptTicks(ticksLocal) + GetOffset(ticksLocal, DateFormatHandling.MicrosoftDateFormat) + @")\/", result.MsDateUnspecified);
|
||||
Assert.AreEqual(@"\/Date(" + JsonConvert.ConvertDateTimeToJavaScriptTicks(ticksLocal) + @")\/", result.MsDateUtc);
|
||||
Assert.AreEqual(@"\/Date(" + DateTimeUtils.ConvertDateTimeToJavaScriptTicks(ticksLocal) + GetOffset(ticksLocal, DateFormatHandling.MicrosoftDateFormat) + @")\/", result.MsDateRoundtrip);
|
||||
Assert.AreEqual(@"\/Date(" + DateTimeUtils.ConvertDateTimeToJavaScriptTicks(ticksLocal) + GetOffset(ticksLocal, DateFormatHandling.MicrosoftDateFormat) + @")\/", result.MsDateLocal);
|
||||
Assert.AreEqual(@"\/Date(" + DateTimeUtils.ConvertDateTimeToJavaScriptTicks(ticksLocal) + GetOffset(ticksLocal, DateFormatHandling.MicrosoftDateFormat) + @")\/", result.MsDateUnspecified);
|
||||
Assert.AreEqual(@"\/Date(" + DateTimeUtils.ConvertDateTimeToJavaScriptTicks(ticksLocal) + @")\/", result.MsDateUtc);
|
||||
|
||||
DateTime year2000Unspecified = new DateTime(2000, 1, 1, 1, 1, 1, DateTimeKind.Unspecified);
|
||||
|
||||
@@ -404,10 +404,10 @@ now brown cow?", '"', true);
|
||||
Assert.AreEqual("2000-01-01T01:01:01" + GetOffset(year2000Unspecified, DateFormatHandling.IsoDateFormat), result.IsoDateLocal);
|
||||
Assert.AreEqual("2000-01-01T01:01:01", result.IsoDateUnspecified);
|
||||
Assert.AreEqual("2000-01-01T01:01:01Z", result.IsoDateUtc);
|
||||
Assert.AreEqual(@"\/Date(" + JsonConvert.ConvertDateTimeToJavaScriptTicks(year2000Unspecified) + GetOffset(year2000Unspecified, DateFormatHandling.MicrosoftDateFormat) + @")\/", result.MsDateRoundtrip);
|
||||
Assert.AreEqual(@"\/Date(" + JsonConvert.ConvertDateTimeToJavaScriptTicks(year2000Unspecified) + GetOffset(year2000Unspecified, DateFormatHandling.MicrosoftDateFormat) + @")\/", result.MsDateLocal);
|
||||
Assert.AreEqual(@"\/Date(" + JsonConvert.ConvertDateTimeToJavaScriptTicks(year2000Unspecified) + GetOffset(year2000Unspecified, DateFormatHandling.MicrosoftDateFormat) + @")\/", result.MsDateUnspecified);
|
||||
Assert.AreEqual(@"\/Date(" + JsonConvert.ConvertDateTimeToJavaScriptTicks(year2000Unspecified.ToLocalTime()) + @")\/", result.MsDateUtc);
|
||||
Assert.AreEqual(@"\/Date(" + DateTimeUtils.ConvertDateTimeToJavaScriptTicks(year2000Unspecified) + GetOffset(year2000Unspecified, DateFormatHandling.MicrosoftDateFormat) + @")\/", result.MsDateRoundtrip);
|
||||
Assert.AreEqual(@"\/Date(" + DateTimeUtils.ConvertDateTimeToJavaScriptTicks(year2000Unspecified) + GetOffset(year2000Unspecified, DateFormatHandling.MicrosoftDateFormat) + @")\/", result.MsDateLocal);
|
||||
Assert.AreEqual(@"\/Date(" + DateTimeUtils.ConvertDateTimeToJavaScriptTicks(year2000Unspecified) + GetOffset(year2000Unspecified, DateFormatHandling.MicrosoftDateFormat) + @")\/", result.MsDateUnspecified);
|
||||
Assert.AreEqual(@"\/Date(" + DateTimeUtils.ConvertDateTimeToJavaScriptTicks(year2000Unspecified.ToLocalTime()) + @")\/", result.MsDateUtc);
|
||||
|
||||
DateTime year2000Utc = new DateTime(2000, 1, 1, 1, 1, 1, DateTimeKind.Utc);
|
||||
string utcTolocalDate = year2000Utc.ToLocalTime().ToString("yyyy-MM-ddTHH:mm:ss");
|
||||
@@ -419,7 +419,7 @@ now brown cow?", '"', true);
|
||||
Assert.AreEqual("2000-01-01T01:01:01Z", result.IsoDateUtc);
|
||||
Assert.AreEqual(@"\/Date(946688461000)\/", result.MsDateRoundtrip);
|
||||
Assert.AreEqual(@"\/Date(946688461000" + GetOffset(year2000Utc, DateFormatHandling.MicrosoftDateFormat) + @")\/", result.MsDateLocal);
|
||||
Assert.AreEqual(@"\/Date(" + JsonConvert.ConvertDateTimeToJavaScriptTicks(DateTime.SpecifyKind(year2000Utc, DateTimeKind.Unspecified)) + GetOffset(year2000Utc, DateFormatHandling.MicrosoftDateFormat) + @")\/", result.MsDateUnspecified);
|
||||
Assert.AreEqual(@"\/Date(" + DateTimeUtils.ConvertDateTimeToJavaScriptTicks(DateTime.SpecifyKind(year2000Utc, DateTimeKind.Unspecified)) + GetOffset(year2000Utc, DateFormatHandling.MicrosoftDateFormat) + @")\/", result.MsDateUnspecified);
|
||||
Assert.AreEqual(@"\/Date(946688461000)\/", result.MsDateUtc);
|
||||
|
||||
DateTime unixEpoc = new DateTime(621355968000000000, DateTimeKind.Utc);
|
||||
@@ -432,7 +432,7 @@ now brown cow?", '"', true);
|
||||
Assert.AreEqual("1970-01-01T00:00:00Z", result.IsoDateUtc);
|
||||
Assert.AreEqual(@"\/Date(0)\/", result.MsDateRoundtrip);
|
||||
Assert.AreEqual(@"\/Date(0" + GetOffset(unixEpoc, DateFormatHandling.MicrosoftDateFormat) + @")\/", result.MsDateLocal);
|
||||
Assert.AreEqual(@"\/Date(" + JsonConvert.ConvertDateTimeToJavaScriptTicks(DateTime.SpecifyKind(unixEpoc, DateTimeKind.Unspecified)) + GetOffset(unixEpoc, DateFormatHandling.MicrosoftDateFormat) + @")\/", result.MsDateUnspecified);
|
||||
Assert.AreEqual(@"\/Date(" + DateTimeUtils.ConvertDateTimeToJavaScriptTicks(DateTime.SpecifyKind(unixEpoc, DateTimeKind.Unspecified)) + GetOffset(unixEpoc, DateFormatHandling.MicrosoftDateFormat) + @")\/", result.MsDateUnspecified);
|
||||
Assert.AreEqual(@"\/Date(0)\/", result.MsDateUtc);
|
||||
|
||||
result = TestDateTime("DateTime Min", DateTime.MinValue);
|
||||
|
||||
@@ -2647,10 +2647,10 @@ bye", reader.Value);
|
||||
|
||||
Assert.IsTrue(reader.Read());
|
||||
Assert.IsTrue(reader.Read());
|
||||
Assert.AreEqual(new DateTime(JsonConvert.InitialJavaScriptDateTicks, DateTimeKind.Utc), reader.Value);
|
||||
Assert.AreEqual(new DateTime(DateTimeUtils.InitialJavaScriptDateTicks, DateTimeKind.Utc), reader.Value);
|
||||
Assert.AreEqual(typeof(DateTime), reader.ValueType);
|
||||
Assert.IsTrue(reader.Read());
|
||||
Assert.AreEqual(new DateTime(JsonConvert.InitialJavaScriptDateTicks, DateTimeKind.Utc), reader.Value);
|
||||
Assert.AreEqual(new DateTime(DateTimeUtils.InitialJavaScriptDateTicks, DateTimeKind.Utc), reader.Value);
|
||||
Assert.AreEqual(typeof(DateTime), reader.ValueType);
|
||||
Assert.IsTrue(reader.Read());
|
||||
|
||||
@@ -2660,10 +2660,10 @@ bye", reader.Value);
|
||||
|
||||
Assert.IsTrue(reader.Read());
|
||||
Assert.IsTrue(reader.Read());
|
||||
Assert.AreEqual(new DateTimeOffset(JsonConvert.InitialJavaScriptDateTicks, TimeSpan.Zero), reader.Value);
|
||||
Assert.AreEqual(new DateTimeOffset(DateTimeUtils.InitialJavaScriptDateTicks, TimeSpan.Zero), reader.Value);
|
||||
Assert.AreEqual(typeof(DateTimeOffset), reader.ValueType);
|
||||
Assert.IsTrue(reader.Read());
|
||||
Assert.AreEqual(new DateTimeOffset(JsonConvert.InitialJavaScriptDateTicks, TimeSpan.Zero), reader.Value);
|
||||
Assert.AreEqual(new DateTimeOffset(DateTimeUtils.InitialJavaScriptDateTicks, TimeSpan.Zero), reader.Value);
|
||||
Assert.AreEqual(typeof(DateTimeOffset), reader.ValueType);
|
||||
Assert.IsTrue(reader.Read());
|
||||
#endif
|
||||
@@ -2686,10 +2686,10 @@ bye", reader.Value);
|
||||
|
||||
Assert.IsTrue(reader.Read());
|
||||
reader.ReadAsDateTimeOffset();
|
||||
Assert.AreEqual(new DateTimeOffset(JsonConvert.InitialJavaScriptDateTicks, TimeSpan.Zero), reader.Value);
|
||||
Assert.AreEqual(new DateTimeOffset(DateTimeUtils.InitialJavaScriptDateTicks, TimeSpan.Zero), reader.Value);
|
||||
Assert.AreEqual(typeof(DateTimeOffset), reader.ValueType);
|
||||
reader.ReadAsDateTimeOffset();
|
||||
Assert.AreEqual(new DateTimeOffset(JsonConvert.InitialJavaScriptDateTicks, TimeSpan.Zero), reader.Value);
|
||||
Assert.AreEqual(new DateTimeOffset(DateTimeUtils.InitialJavaScriptDateTicks, TimeSpan.Zero), reader.Value);
|
||||
Assert.AreEqual(typeof(DateTimeOffset), reader.ValueType);
|
||||
Assert.IsTrue(reader.Read());
|
||||
|
||||
@@ -2699,10 +2699,10 @@ bye", reader.Value);
|
||||
|
||||
Assert.IsTrue(reader.Read());
|
||||
reader.ReadAsDateTime();
|
||||
Assert.AreEqual(new DateTime(JsonConvert.InitialJavaScriptDateTicks, DateTimeKind.Utc), reader.Value);
|
||||
Assert.AreEqual(new DateTime(DateTimeUtils.InitialJavaScriptDateTicks, DateTimeKind.Utc), reader.Value);
|
||||
Assert.AreEqual(typeof(DateTime), reader.ValueType);
|
||||
reader.ReadAsDateTime();
|
||||
Assert.AreEqual(new DateTime(JsonConvert.InitialJavaScriptDateTicks, DateTimeKind.Utc), reader.Value);
|
||||
Assert.AreEqual(new DateTime(DateTimeUtils.InitialJavaScriptDateTicks, DateTimeKind.Utc), reader.Value);
|
||||
Assert.AreEqual(typeof(DateTime), reader.ValueType);
|
||||
Assert.IsTrue(reader.Read());
|
||||
#endif
|
||||
|
||||
@@ -144,10 +144,10 @@ namespace Newtonsoft.Json.Tests
|
||||
jsonWriter.WriteValue((decimal?)null);
|
||||
jsonWriter.WriteValue((decimal?)1.1m);
|
||||
jsonWriter.WriteValue((DateTime?)null);
|
||||
jsonWriter.WriteValue((DateTime?)new DateTime(JsonConvert.InitialJavaScriptDateTicks, DateTimeKind.Utc));
|
||||
jsonWriter.WriteValue((DateTime?)new DateTime(DateTimeUtils.InitialJavaScriptDateTicks, DateTimeKind.Utc));
|
||||
#if !NET20
|
||||
jsonWriter.WriteValue((DateTimeOffset?)null);
|
||||
jsonWriter.WriteValue((DateTimeOffset?)new DateTimeOffset(JsonConvert.InitialJavaScriptDateTicks, TimeSpan.Zero));
|
||||
jsonWriter.WriteValue((DateTimeOffset?)new DateTimeOffset(DateTimeUtils.InitialJavaScriptDateTicks, TimeSpan.Zero));
|
||||
#endif
|
||||
jsonWriter.WriteEndArray();
|
||||
}
|
||||
@@ -731,6 +731,46 @@ namespace Newtonsoft.Json.Tests
|
||||
Assert.AreEqual(@"[0.0,0.0,0.1,1.0,1.000001,1E-06,4.94065645841247E-324,Infinity,-Infinity,NaN,1.7976931348623157E+308,-1.7976931348623157E+308,Infinity,-Infinity,NaN]", sb.ToString());
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void WriteIntegerNumber()
|
||||
{
|
||||
StringBuilder sb = new StringBuilder();
|
||||
StringWriter sw = new StringWriter(sb);
|
||||
|
||||
using (JsonWriter jsonWriter = new JsonTextWriter(sw) { Formatting = Formatting.Indented })
|
||||
{
|
||||
jsonWriter.WriteStartArray();
|
||||
|
||||
jsonWriter.WriteValue(0);
|
||||
jsonWriter.WriteValue(-0);
|
||||
jsonWriter.WriteValue(9L);
|
||||
jsonWriter.WriteValue(9UL);
|
||||
jsonWriter.WriteValue(int.MaxValue);
|
||||
jsonWriter.WriteValue(int.MinValue);
|
||||
jsonWriter.WriteValue(long.MaxValue);
|
||||
jsonWriter.WriteValue(long.MinValue);
|
||||
jsonWriter.WriteValue(ulong.MaxValue);
|
||||
jsonWriter.WriteValue(ulong.MinValue);
|
||||
|
||||
jsonWriter.WriteEndArray();
|
||||
}
|
||||
|
||||
Console.WriteLine(sb.ToString());
|
||||
|
||||
Assert.AreEqual(@"[
|
||||
0,
|
||||
0,
|
||||
9,
|
||||
9,
|
||||
2147483647,
|
||||
-2147483648,
|
||||
9223372036854775807,
|
||||
-9223372036854775808,
|
||||
18446744073709551615,
|
||||
0
|
||||
]", sb.ToString());
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void BadWriteEndArray()
|
||||
{
|
||||
|
||||
@@ -50,6 +50,7 @@ using Newtonsoft.Json.Utilities.LinqBridge;
|
||||
#else
|
||||
using System.Linq;
|
||||
#endif
|
||||
using Newtonsoft.Json.Utilities;
|
||||
|
||||
namespace Newtonsoft.Json.Tests.Linq
|
||||
{
|
||||
@@ -419,7 +420,7 @@ Parameter name: arrayIndex",
|
||||
JArray a = (JArray)JsonConvert.DeserializeObject(json);
|
||||
JValue v = (JValue)a[0];
|
||||
|
||||
Assert.AreEqual(JsonConvert.ConvertJavaScriptTicksToDateTime(1207285200000), (DateTime)v);
|
||||
Assert.AreEqual(DateTimeUtils.ConvertJavaScriptTicksToDateTime(1207285200000), (DateTime)v);
|
||||
}
|
||||
|
||||
[Test]
|
||||
|
||||
@@ -43,6 +43,7 @@ using System.IO;
|
||||
using Newtonsoft.Json.Utilities.LinqBridge;
|
||||
#else
|
||||
using System.Linq;
|
||||
using Newtonsoft.Json.Utilities;
|
||||
#endif
|
||||
|
||||
namespace Newtonsoft.Json.Tests.Linq
|
||||
@@ -90,7 +91,7 @@ namespace Newtonsoft.Json.Tests.Linq
|
||||
DateParseHandling = DateParseHandling.DateTimeOffset
|
||||
});
|
||||
Assert.AreEqual(typeof(DateTimeOffset), v.Value.GetType());
|
||||
Assert.AreEqual(new DateTimeOffset(JsonConvert.InitialJavaScriptDateTicks, new TimeSpan(12, 31, 0)), v.Value);
|
||||
Assert.AreEqual(new DateTimeOffset(DateTimeUtils.InitialJavaScriptDateTicks, new TimeSpan(12, 31, 0)), v.Value);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
@@ -236,8 +236,10 @@
|
||||
<Compile Include="TestObjects\UserNullable.cs" />
|
||||
<Compile Include="TestObjects\VersionKeyedCollection.cs" />
|
||||
<Compile Include="TestObjects\WagePerson.cs" />
|
||||
<Compile Include="Utilities\DateTimeUtilsTests.cs" />
|
||||
<Compile Include="Utilities\DynamicReflectionDelegateFactoryTests.cs" />
|
||||
<Compile Include="Utilities\ReflectionUtilsTests.cs" />
|
||||
<Compile Include="Utilities\StringUtilsTests.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Service Include="{3259AA49-8AA1-44D3-9025-A0B520596A8C}" />
|
||||
|
||||
@@ -278,8 +278,10 @@
|
||||
<Compile Include="TestObjects\TypeClass.cs" />
|
||||
<Compile Include="TestObjects\TypedSubHashtable.cs" />
|
||||
<Compile Include="TestObjects\UserNullable.cs" />
|
||||
<Compile Include="Utilities\DateTimeUtilsTests.cs" />
|
||||
<Compile Include="Utilities\DynamicReflectionDelegateFactoryTests.cs" />
|
||||
<Compile Include="Utilities\ReflectionUtilsTests.cs" />
|
||||
<Compile Include="Utilities\StringUtilsTests.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="LinqToSql\LinqToSqlClasses.dbml">
|
||||
|
||||
@@ -396,6 +396,7 @@
|
||||
<Compile Include="TestObjects\TypeClass.cs" />
|
||||
<Compile Include="TestObjects\TypedSubHashtable.cs" />
|
||||
<Compile Include="TestObjects\UserNullable.cs" />
|
||||
<Compile Include="Utilities\DateTimeUtilsTests.cs" />
|
||||
<Compile Include="Utilities\DynamicReflectionDelegateFactoryTests.cs" />
|
||||
<Compile Include="Utilities\ReflectionUtilsTests.cs" />
|
||||
<Compile Include="Utilities\StringUtilsTests.cs" />
|
||||
|
||||
@@ -277,6 +277,7 @@
|
||||
<Compile Include="TestObjects\TypeClass.cs" />
|
||||
<Compile Include="TestObjects\TypedSubHashtable.cs" />
|
||||
<Compile Include="TestObjects\UserNullable.cs" />
|
||||
<Compile Include="Utilities\DateTimeUtilsTests.cs" />
|
||||
<Compile Include="Utilities\DynamicReflectionDelegateFactoryTests.cs" />
|
||||
<Compile Include="Utilities\ReflectionUtilsTests.cs" />
|
||||
<Compile Include="Utilities\StringUtilsTests.cs" />
|
||||
|
||||
@@ -277,6 +277,7 @@
|
||||
<Compile Include="TestObjects\TypeClass.cs" />
|
||||
<Compile Include="TestObjects\TypedSubHashtable.cs" />
|
||||
<Compile Include="TestObjects\UserNullable.cs" />
|
||||
<Compile Include="Utilities\DateTimeUtilsTests.cs" />
|
||||
<Compile Include="Utilities\DynamicReflectionDelegateFactoryTests.cs" />
|
||||
<Compile Include="Utilities\ReflectionUtilsTests.cs" />
|
||||
<Compile Include="Utilities\StringUtilsTests.cs" />
|
||||
|
||||
@@ -340,6 +340,7 @@
|
||||
<Compile Include="TestObjects\UserNullable.cs" />
|
||||
<Compile Include="TestObjects\VersionKeyedCollection.cs" />
|
||||
<Compile Include="TestObjects\WagePerson.cs" />
|
||||
<Compile Include="Utilities\DateTimeUtilsTests.cs" />
|
||||
<Compile Include="Utilities\DynamicReflectionDelegateFactoryTests.cs" />
|
||||
<Compile Include="Utilities\ReflectionUtilsTests.cs" />
|
||||
<Compile Include="Utilities\StringUtilsTests.cs" />
|
||||
|
||||
@@ -64,8 +64,8 @@ namespace Newtonsoft.Json.Tests
|
||||
[TestFixture]
|
||||
public class PerformanceTests : TestFixtureBase
|
||||
{
|
||||
//private const int Iterations = 100;
|
||||
private const int Iterations = 5000;
|
||||
private const int Iterations = 100;
|
||||
//private const int Iterations = 5000;
|
||||
|
||||
#region Data
|
||||
|
||||
@@ -105,7 +105,7 @@ namespace Newtonsoft.Json.Tests
|
||||
[Test]
|
||||
public void SerializeSimpleObject()
|
||||
{
|
||||
var value = CreateSimpleObject();
|
||||
SimpleObject value = CreateSimpleObject();
|
||||
|
||||
SerializeTests(value);
|
||||
}
|
||||
@@ -140,19 +140,19 @@ namespace Newtonsoft.Json.Tests
|
||||
[Test]
|
||||
public void Deserialize()
|
||||
{
|
||||
//BenchmarkDeserializeMethod<TestClass>(SerializeMethod.DataContractSerializer, XmlText);
|
||||
//BenchmarkDeserializeMethod<TestClass>(SerializeMethod.BinaryFormatter, MiscellaneousUtils.HexToBytes(BinaryFormatterHex));
|
||||
BenchmarkDeserializeMethod<TestClass>(SerializeMethod.DataContractSerializer, XmlText);
|
||||
BenchmarkDeserializeMethod<TestClass>(SerializeMethod.BinaryFormatter, HexToBytes(BinaryFormatterHex));
|
||||
DeserializeTests<TestClass>(JsonText);
|
||||
//BenchmarkDeserializeMethod<TestClass>(SerializeMethod.JsonNetWithIsoConverter, JsonIsoText);
|
||||
//BenchmarkDeserializeMethod<TestClass>(SerializeMethod.JsonNetBinary, MiscellaneousUtils.HexToBytes(BsonHex));
|
||||
BenchmarkDeserializeMethod<TestClass>(SerializeMethod.JsonNetWithIsoConverter, JsonIsoText);
|
||||
BenchmarkDeserializeMethod<TestClass>(SerializeMethod.JsonNetBinary, HexToBytes(BsonHex));
|
||||
}
|
||||
|
||||
public void DeserializeTests<T>(string json)
|
||||
{
|
||||
//BenchmarkDeserializeMethod<T>(SerializeMethod.JavaScriptSerializer, json);
|
||||
//BenchmarkDeserializeMethod<T>(SerializeMethod.DataContractJsonSerializer, json);
|
||||
BenchmarkDeserializeMethod<T>(SerializeMethod.JavaScriptSerializer, json);
|
||||
BenchmarkDeserializeMethod<T>(SerializeMethod.DataContractJsonSerializer, json);
|
||||
BenchmarkDeserializeMethod<T>(SerializeMethod.JsonNet, json);
|
||||
//BenchmarkDeserializeMethod<T>(SerializeMethod.JsonNetManual, json);
|
||||
BenchmarkDeserializeMethod<T>(SerializeMethod.JsonNetManual, json);
|
||||
}
|
||||
|
||||
[Test]
|
||||
|
||||
@@ -75,4 +75,4 @@ using System.Security;
|
||||
// You can specify all the values or you can default the Revision and Build Numbers
|
||||
// by using the '*' as shown below:
|
||||
[assembly: AssemblyVersion("4.5.0.0")]
|
||||
[assembly: AssemblyFileVersion("5.0.1.16008")]
|
||||
[assembly: AssemblyFileVersion("5.0.4.16021")]
|
||||
|
||||
@@ -1231,7 +1231,7 @@ keyword such as type of business.""
|
||||
[Test]
|
||||
public void SerializerShouldUseMemberConverter_IsoDate()
|
||||
{
|
||||
DateTime testDate = new DateTime(JsonConvert.InitialJavaScriptDateTicks, DateTimeKind.Utc);
|
||||
DateTime testDate = new DateTime(DateTimeUtils.InitialJavaScriptDateTicks, DateTimeKind.Utc);
|
||||
MemberConverterClass m1 = new MemberConverterClass { DefaultConverter = testDate, MemberConverter = testDate };
|
||||
|
||||
string json = JsonConvert.SerializeObject(m1);
|
||||
@@ -1246,7 +1246,7 @@ keyword such as type of business.""
|
||||
[Test]
|
||||
public void SerializerShouldUseMemberConverter_MsDate()
|
||||
{
|
||||
DateTime testDate = new DateTime(JsonConvert.InitialJavaScriptDateTicks, DateTimeKind.Utc);
|
||||
DateTime testDate = new DateTime(DateTimeUtils.InitialJavaScriptDateTicks, DateTimeKind.Utc);
|
||||
MemberConverterClass m1 = new MemberConverterClass { DefaultConverter = testDate, MemberConverter = testDate };
|
||||
|
||||
string json = JsonConvert.SerializeObject(m1, new JsonSerializerSettings
|
||||
@@ -1264,7 +1264,7 @@ keyword such as type of business.""
|
||||
[Test]
|
||||
public void SerializerShouldUseMemberConverter_MsDate_DateParseNone()
|
||||
{
|
||||
DateTime testDate = new DateTime(JsonConvert.InitialJavaScriptDateTicks, DateTimeKind.Utc);
|
||||
DateTime testDate = new DateTime(DateTimeUtils.InitialJavaScriptDateTicks, DateTimeKind.Utc);
|
||||
MemberConverterClass m1 = new MemberConverterClass { DefaultConverter = testDate, MemberConverter = testDate };
|
||||
|
||||
string json = JsonConvert.SerializeObject(m1, new JsonSerializerSettings
|
||||
@@ -1287,7 +1287,7 @@ keyword such as type of business.""
|
||||
[Test]
|
||||
public void SerializerShouldUseMemberConverter_IsoDate_DateParseNone()
|
||||
{
|
||||
DateTime testDate = new DateTime(JsonConvert.InitialJavaScriptDateTicks, DateTimeKind.Utc);
|
||||
DateTime testDate = new DateTime(DateTimeUtils.InitialJavaScriptDateTicks, DateTimeKind.Utc);
|
||||
MemberConverterClass m1 = new MemberConverterClass { DefaultConverter = testDate, MemberConverter = testDate };
|
||||
|
||||
string json = JsonConvert.SerializeObject(m1, new JsonSerializerSettings
|
||||
@@ -1305,7 +1305,7 @@ keyword such as type of business.""
|
||||
[Test]
|
||||
public void SerializerShouldUseMemberConverterOverArgumentConverter()
|
||||
{
|
||||
DateTime testDate = new DateTime(JsonConvert.InitialJavaScriptDateTicks, DateTimeKind.Utc);
|
||||
DateTime testDate = new DateTime(DateTimeUtils.InitialJavaScriptDateTicks, DateTimeKind.Utc);
|
||||
MemberConverterClass m1 = new MemberConverterClass { DefaultConverter = testDate, MemberConverter = testDate };
|
||||
|
||||
string json = JsonConvert.SerializeObject(m1, new JavaScriptDateTimeConverter());
|
||||
@@ -6807,9 +6807,9 @@ Parameter name: value",
|
||||
Venue = "Gryphon Theatre",
|
||||
Performances = new List<DateTime>
|
||||
{
|
||||
JsonConvert.ConvertJavaScriptTicksToDateTime(1336458600000),
|
||||
JsonConvert.ConvertJavaScriptTicksToDateTime(1336545000000),
|
||||
JsonConvert.ConvertJavaScriptTicksToDateTime(1336636800000)
|
||||
DateTimeUtils.ConvertJavaScriptTicksToDateTime(1336458600000),
|
||||
DateTimeUtils.ConvertJavaScriptTicksToDateTime(1336545000000),
|
||||
DateTimeUtils.ConvertJavaScriptTicksToDateTime(1336636800000)
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -69,11 +69,10 @@ namespace Newtonsoft.Json.Tests
|
||||
|
||||
protected string GetOffset(DateTime d, DateFormatHandling dateFormatHandling)
|
||||
{
|
||||
StringWriter sw = new StringWriter();
|
||||
JsonConvert.WriteDateTimeOffset(sw, DateTime.SpecifyKind(d, DateTimeKind.Local).GetUtcOffset(), dateFormatHandling);
|
||||
sw.Flush();
|
||||
char[] chars = new char[8];
|
||||
int pos = DateTimeUtils.WriteDateTimeOffset(chars, 0, DateTime.SpecifyKind(d, DateTimeKind.Local).GetUtcOffset(), dateFormatHandling);
|
||||
|
||||
return sw.ToString();
|
||||
return new string(chars, 0, pos);
|
||||
}
|
||||
|
||||
protected string BytesToHex(byte[] bytes)
|
||||
|
||||
@@ -0,0 +1,193 @@
|
||||
#region License
|
||||
// Copyright (c) 2007 James Newton-King
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person
|
||||
// obtaining a copy of this software and associated documentation
|
||||
// files (the "Software"), to deal in the Software without
|
||||
// restriction, including without limitation the rights to use,
|
||||
// copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
// copies of the Software, and to permit persons to whom the
|
||||
// Software is furnished to do so, subject to the following
|
||||
// conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||
// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||
// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
// OTHER DEALINGS IN THE SOFTWARE.
|
||||
#endregion
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Globalization;
|
||||
using System.Text;
|
||||
using NUnit.Framework;
|
||||
using Newtonsoft.Json.Utilities;
|
||||
|
||||
namespace Newtonsoft.Json.Tests.Utilities
|
||||
{
|
||||
[TestFixture]
|
||||
public class DateTimeUtilsTests : TestFixtureBase
|
||||
{
|
||||
[Test]
|
||||
public void NewDateTimeParse()
|
||||
{
|
||||
AssertNewDateTimeParseEqual("999x-12-31T23:59:59");
|
||||
AssertNewDateTimeParseEqual("9999x12-31T23:59:59");
|
||||
AssertNewDateTimeParseEqual("9999-1x-31T23:59:59");
|
||||
AssertNewDateTimeParseEqual("9999-12x31T23:59:59");
|
||||
AssertNewDateTimeParseEqual("9999-12-3xT23:59:59");
|
||||
AssertNewDateTimeParseEqual("9999-12-31x23:59:59");
|
||||
AssertNewDateTimeParseEqual("9999-12-31T2x:59:59");
|
||||
AssertNewDateTimeParseEqual("9999-12-31T23x59:59");
|
||||
AssertNewDateTimeParseEqual("9999-12-31T23:5x:59");
|
||||
AssertNewDateTimeParseEqual("9999-12-31T23:59x59");
|
||||
AssertNewDateTimeParseEqual("9999-12-31T23:59:5x");
|
||||
AssertNewDateTimeParseEqual("9999-12-31T23:59:5");
|
||||
AssertNewDateTimeParseEqual("9999-12-31T23:59:59.x");
|
||||
AssertNewDateTimeParseEqual("9999-12-31T23:59:59.99999999");
|
||||
AssertNewDateTimeParseEqual("9999-12-31T23:59:59.", null); // DateTime.TryParse is bugged and should return null
|
||||
|
||||
AssertNewDateTimeParseEqual("2000-12-15T22:11:03.055Z");
|
||||
AssertNewDateTimeParseEqual("2000-12-15T22:11:03.055");
|
||||
AssertNewDateTimeParseEqual("2000-12-15T22:11:03.055+00:00");
|
||||
AssertNewDateTimeParseEqual("2000-12-15T22:11:03.055+23:30");
|
||||
AssertNewDateTimeParseEqual("2000-12-15T22:11:03.055-23:30");
|
||||
AssertNewDateTimeParseEqual("2000-12-15T22:11:03.055+11:30");
|
||||
AssertNewDateTimeParseEqual("2000-12-15T22:11:03.055-11:30");
|
||||
|
||||
AssertNewDateTimeParseEqual("2000-12-15T22:11:03Z");
|
||||
AssertNewDateTimeParseEqual("2000-12-15T22:11:03");
|
||||
AssertNewDateTimeParseEqual("2000-12-15T22:11:03+00:00");
|
||||
AssertNewDateTimeParseEqual("2000-12-15T22:11:03+23:30");
|
||||
AssertNewDateTimeParseEqual("2000-12-15T22:11:03-23:30");
|
||||
AssertNewDateTimeParseEqual("2000-12-15T22:11:03+11:30");
|
||||
AssertNewDateTimeParseEqual("2000-12-15T22:11:03-11:30");
|
||||
|
||||
AssertNewDateTimeParseEqual("0001-01-01T00:00:00Z");
|
||||
AssertNewDateTimeParseEqual("0001-01-01T00:00:00");
|
||||
AssertNewDateTimeParseEqual("0001-01-01T00:00:00+00:00");
|
||||
//AssertNewDateTimeParseEqual("0001-01-01T00:00:00+23:30"); // I don't know why a different value is returned from DateTime.TryParse, I think it is a bug in .NET
|
||||
AssertNewDateTimeParseEqual("0001-01-01T00:00:00-23:30");
|
||||
AssertNewDateTimeParseEqual("0001-01-01T00:00:00+11:30");
|
||||
AssertNewDateTimeParseEqual("0001-01-01T00:00:00-11:30");
|
||||
|
||||
AssertNewDateTimeParseEqual("9999-12-31T23:59:59.9999999Z");
|
||||
AssertNewDateTimeParseEqual("9999-12-31T23:59:59.9999999");
|
||||
AssertNewDateTimeParseEqual("9999-12-31T23:59:59.9999999+00:00", DateTime.MaxValue); // DateTime.TryParse fails instead of returning MaxDate
|
||||
AssertNewDateTimeParseEqual("9999-12-31T23:59:59.9999999+23:30");
|
||||
AssertNewDateTimeParseEqual("9999-12-31T23:59:59.9999999-23:30", DateTime.MaxValue); // DateTime.TryParse fails instead of returning MaxDate
|
||||
AssertNewDateTimeParseEqual("9999-12-31T23:59:59.9999999+11:30", DateTime.MaxValue); // DateTime.TryParse fails instead of returning MaxDate
|
||||
AssertNewDateTimeParseEqual("9999-12-31T23:59:59.9999999-11:30", DateTime.MaxValue); // DateTime.TryParse fails instead of returning MaxDate
|
||||
}
|
||||
|
||||
private void AssertNewDateTimeParseEqual(string text, object oldDate)
|
||||
{
|
||||
object newDt;
|
||||
DateTimeUtils.TryParseDateIso(text, DateParseHandling.DateTime, DateTimeZoneHandling.RoundtripKind, out newDt);
|
||||
|
||||
if (!Equals(oldDate, newDt))
|
||||
{
|
||||
Assert.AreEqual(oldDate, newDt, "DateTime parse not equal. Text: '{0}' Old ticks: {1} New ticks: {2}".FormatWith(
|
||||
CultureInfo.InvariantCulture,
|
||||
text,
|
||||
oldDate != null ? ((DateTime)oldDate).Ticks : (long?)null,
|
||||
newDt != null ? ((DateTime)newDt).Ticks : (long?)null
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
private void AssertNewDateTimeParseEqual(string text)
|
||||
{
|
||||
object oldDt;
|
||||
TryParseDateIso(text, DateParseHandling.DateTime, DateTimeZoneHandling.RoundtripKind, out oldDt);
|
||||
|
||||
AssertNewDateTimeParseEqual(text, oldDt);
|
||||
}
|
||||
|
||||
#if !NET20
|
||||
[Test]
|
||||
public void NewDateTimeOffsetParse()
|
||||
{
|
||||
AssertNewDateTimeOffsetParseEqual("0001-01-01T00:00:00");
|
||||
|
||||
AssertNewDateTimeOffsetParseEqual("2000-12-15T22:11:03.055Z");
|
||||
AssertNewDateTimeOffsetParseEqual("2000-12-15T22:11:03.055");
|
||||
AssertNewDateTimeOffsetParseEqual("2000-12-15T22:11:03.055+00:00");
|
||||
AssertNewDateTimeOffsetParseEqual("2000-12-15T22:11:03.055+13:30");
|
||||
AssertNewDateTimeOffsetParseEqual("2000-12-15T22:11:03.055-13:30");
|
||||
|
||||
AssertNewDateTimeOffsetParseEqual("2000-12-15T22:11:03Z");
|
||||
AssertNewDateTimeOffsetParseEqual("2000-12-15T22:11:03");
|
||||
AssertNewDateTimeOffsetParseEqual("2000-12-15T22:11:03+00:00");
|
||||
AssertNewDateTimeOffsetParseEqual("2000-12-15T22:11:03+13:30");
|
||||
AssertNewDateTimeOffsetParseEqual("2000-12-15T22:11:03-13:30");
|
||||
|
||||
AssertNewDateTimeOffsetParseEqual("0001-01-01T00:00:00Z");
|
||||
AssertNewDateTimeOffsetParseEqual("0001-01-01T00:00:00+00:00");
|
||||
AssertNewDateTimeOffsetParseEqual("0001-01-01T00:00:00+13:30");
|
||||
AssertNewDateTimeOffsetParseEqual("0001-01-01T00:00:00-13:30");
|
||||
|
||||
AssertNewDateTimeOffsetParseEqual("9999-12-31T23:59:59.9999999Z");
|
||||
AssertNewDateTimeOffsetParseEqual("9999-12-31T23:59:59.9999999");
|
||||
AssertNewDateTimeOffsetParseEqual("9999-12-31T23:59:59.9999999+00:00");
|
||||
AssertNewDateTimeOffsetParseEqual("9999-12-31T23:59:59.9999999+13:30");
|
||||
AssertNewDateTimeOffsetParseEqual("9999-12-31T23:59:59.9999999-13:30");
|
||||
}
|
||||
|
||||
private void AssertNewDateTimeOffsetParseEqual(string text)
|
||||
{
|
||||
object oldDt;
|
||||
object newDt;
|
||||
TryParseDateIso(text, DateParseHandling.DateTimeOffset, DateTimeZoneHandling.Unspecified, out oldDt);
|
||||
DateTimeUtils.TryParseDateIso(text, DateParseHandling.DateTimeOffset, DateTimeZoneHandling.Unspecified, out newDt);
|
||||
|
||||
if (!Equals(oldDt, newDt))
|
||||
{
|
||||
Assert.AreEqual(oldDt, newDt, "DateTimeOffset parse not equal. Text: '{0}' Old ticks: {1} New ticks: {2}".FormatWith(
|
||||
CultureInfo.InvariantCulture,
|
||||
text,
|
||||
((DateTime)oldDt).Ticks,
|
||||
((DateTime)newDt).Ticks));
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
internal static bool TryParseDateIso(string text, DateParseHandling dateParseHandling, DateTimeZoneHandling dateTimeZoneHandling, out object dt)
|
||||
{
|
||||
const string isoDateFormat = "yyyy-MM-ddTHH:mm:ss.FFFFFFFK";
|
||||
|
||||
#if !NET20
|
||||
if (dateParseHandling == DateParseHandling.DateTimeOffset)
|
||||
{
|
||||
DateTimeOffset dateTimeOffset;
|
||||
if (DateTimeOffset.TryParseExact(text, isoDateFormat, CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind, out dateTimeOffset))
|
||||
{
|
||||
dt = dateTimeOffset;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
DateTime dateTime;
|
||||
if (DateTime.TryParseExact(text, isoDateFormat, CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind, out dateTime))
|
||||
{
|
||||
dateTime = DateTimeUtils.EnsureDateTime(dateTime, dateTimeZoneHandling);
|
||||
|
||||
dt = dateTime;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
dt = null;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -25,6 +25,7 @@
|
||||
|
||||
#if !(SILVERLIGHT || PORTABLE || NETFX_CORE || PORTABLE40)
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Reflection;
|
||||
#if !NETFX_CORE
|
||||
using NUnit.Framework;
|
||||
@@ -74,6 +75,8 @@ namespace Newtonsoft.Json.Tests.Utilities
|
||||
Assert.AreEqual(m.Name, "Hi");
|
||||
|
||||
setter(p, "Hi");
|
||||
|
||||
Assert.AreEqual(p.Name, "Hi");
|
||||
});
|
||||
}
|
||||
|
||||
@@ -124,42 +127,6 @@ namespace Newtonsoft.Json.Tests.Utilities
|
||||
JsonSerializerTest.DictionaryKey key = (JsonSerializerTest.DictionaryKey) result;
|
||||
Assert.AreEqual("First!", key.Value);
|
||||
}
|
||||
|
||||
//[Test]
|
||||
//public void sdfsdf()
|
||||
//{
|
||||
// string name = "MyAssembly";
|
||||
// string filename = name + ".dll";
|
||||
|
||||
// AssemblyName s = new AssemblyName(name);
|
||||
|
||||
// AssemblyBuilder assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(s, AssemblyBuilderAccess.RunAndSave);
|
||||
// ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule(filename, filename);
|
||||
// TypeBuilder typeBuilder = moduleBuilder.DefineType("MyType", TypeAttributes.Class, typeof(object));
|
||||
// MethodBuilder methodBuilder = typeBuilder.DefineMethod("TestSet", MethodAttributes.Public | MethodAttributes.Static, typeof(void), new[] { typeof(object), typeof(object) });
|
||||
|
||||
// DynamicReflectionDelegateFactory.GenerateCreateSetFieldIL(typeof(ClassWithGuid).GetField("GuidField"), methodBuilder.GetILGenerator());
|
||||
// typeBuilder.CreateType();
|
||||
// assemblyBuilder.Save(filename);
|
||||
//}
|
||||
|
||||
//[Test]
|
||||
//public void sdfsdf1()
|
||||
//{
|
||||
// string name = "MyAssembly1";
|
||||
// string filename = name + ".dll";
|
||||
|
||||
// AssemblyName s = new AssemblyName(name);
|
||||
|
||||
// AssemblyBuilder assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(s, AssemblyBuilderAccess.RunAndSave);
|
||||
// ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule(filename, filename);
|
||||
// TypeBuilder typeBuilder = moduleBuilder.DefineType("MyType", TypeAttributes.Class, typeof(object));
|
||||
// MethodBuilder methodBuilder = typeBuilder.DefineMethod("TestSet", MethodAttributes.Public | MethodAttributes.Static, typeof(void), new[] { typeof(object), typeof(object) });
|
||||
|
||||
// DynamicReflectionDelegateFactory.GenerateCreateSetPropertyIL(typeof(Car).GetProperty("Model"), methodBuilder.GetILGenerator());
|
||||
// typeBuilder.CreateType();
|
||||
// assemblyBuilder.Save(filename);
|
||||
//}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
@@ -1,7 +1,28 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
#region License
|
||||
// Copyright (c) 2007 James Newton-King
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person
|
||||
// obtaining a copy of this software and associated documentation
|
||||
// files (the "Software"), to deal in the Software without
|
||||
// restriction, including without limitation the rights to use,
|
||||
// copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
// copies of the Software, and to permit persons to whom the
|
||||
// Software is furnished to do so, subject to the following
|
||||
// conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||
// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||
// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
// OTHER DEALINGS IN THE SOFTWARE.
|
||||
#endregion
|
||||
|
||||
using NUnit.Framework;
|
||||
using Newtonsoft.Json.Utilities;
|
||||
|
||||
|
||||
@@ -146,13 +146,13 @@ namespace Newtonsoft.Json.Bson
|
||||
else if (DateTimeKindHandling == DateTimeKind.Local)
|
||||
dateTime = dateTime.ToLocalTime();
|
||||
|
||||
ticks = JsonConvert.ConvertDateTimeToJavaScriptTicks(dateTime, false);
|
||||
ticks = DateTimeUtils.ConvertDateTimeToJavaScriptTicks(dateTime, false);
|
||||
}
|
||||
#if !NET20
|
||||
else
|
||||
{
|
||||
DateTimeOffset dateTimeOffset = (DateTimeOffset)value.Value;
|
||||
ticks = JsonConvert.ConvertDateTimeToJavaScriptTicks(dateTimeOffset.UtcDateTime, dateTimeOffset.Offset);
|
||||
ticks = DateTimeUtils.ConvertDateTimeToJavaScriptTicks(dateTimeOffset.UtcDateTime, dateTimeOffset.Offset);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
@@ -550,7 +550,7 @@ namespace Newtonsoft.Json.Bson
|
||||
break;
|
||||
case BsonType.Date:
|
||||
long ticks = ReadInt64();
|
||||
DateTime utcDateTime = JsonConvert.ConvertJavaScriptTicksToDateTime(ticks);
|
||||
DateTime utcDateTime = DateTimeUtils.ConvertJavaScriptTicksToDateTime(ticks);
|
||||
|
||||
DateTime dateTime;
|
||||
switch (DateTimeKindHandling)
|
||||
|
||||
@@ -425,7 +425,7 @@ namespace Newtonsoft.Json.Bson
|
||||
public override void WriteValue(DateTime value)
|
||||
{
|
||||
base.WriteValue(value);
|
||||
value = JsonConvert.EnsureDateTime(value, DateTimeZoneHandling);
|
||||
value = DateTimeUtils.EnsureDateTime(value, DateTimeZoneHandling);
|
||||
AddValue(value, BsonType.Date);
|
||||
}
|
||||
|
||||
|
||||
@@ -48,14 +48,14 @@ namespace Newtonsoft.Json.Converters
|
||||
{
|
||||
DateTime dateTime = (DateTime)value;
|
||||
DateTime utcDateTime = dateTime.ToUniversalTime();
|
||||
ticks = JsonConvert.ConvertDateTimeToJavaScriptTicks(utcDateTime);
|
||||
ticks = DateTimeUtils.ConvertDateTimeToJavaScriptTicks(utcDateTime);
|
||||
}
|
||||
#if !NET20
|
||||
else if (value is DateTimeOffset)
|
||||
{
|
||||
DateTimeOffset dateTimeOffset = (DateTimeOffset)value;
|
||||
DateTimeOffset utcDateTimeOffset = dateTimeOffset.ToUniversalTime();
|
||||
ticks = JsonConvert.ConvertDateTimeToJavaScriptTicks(utcDateTimeOffset.UtcDateTime);
|
||||
ticks = DateTimeUtils.ConvertDateTimeToJavaScriptTicks(utcDateTimeOffset.UtcDateTime);
|
||||
}
|
||||
#endif
|
||||
else
|
||||
@@ -100,7 +100,7 @@ namespace Newtonsoft.Json.Converters
|
||||
|
||||
long ticks = (long)reader.Value;
|
||||
|
||||
DateTime d = JsonConvert.ConvertJavaScriptTicksToDateTime(ticks);
|
||||
DateTime d = DateTimeUtils.ConvertJavaScriptTicksToDateTime(ticks);
|
||||
|
||||
reader.Read();
|
||||
|
||||
|
||||
@@ -86,8 +86,6 @@ namespace Newtonsoft.Json
|
||||
/// </summary>
|
||||
public static readonly string NaN = "NaN";
|
||||
|
||||
internal static readonly long InitialJavaScriptDateTicks = 621355968000000000;
|
||||
|
||||
/// <summary>
|
||||
/// Converts the <see cref="DateTime"/> to its JSON string representation.
|
||||
/// </summary>
|
||||
@@ -107,39 +105,17 @@ namespace Newtonsoft.Json
|
||||
/// <returns>A JSON string representation of the <see cref="DateTime"/>.</returns>
|
||||
public static string ToString(DateTime value, DateFormatHandling format, DateTimeZoneHandling timeZoneHandling)
|
||||
{
|
||||
DateTime updatedDateTime = EnsureDateTime(value, timeZoneHandling);
|
||||
DateTime updatedDateTime = DateTimeUtils.EnsureDateTime(value, timeZoneHandling);
|
||||
|
||||
using (StringWriter writer = StringUtils.CreateStringWriter(64))
|
||||
{
|
||||
writer.Write('"');
|
||||
WriteDateTimeString(writer, updatedDateTime, updatedDateTime.GetUtcOffset(), updatedDateTime.Kind, format);
|
||||
DateTimeUtils.WriteDateTimeString(writer, updatedDateTime, format, null, CultureInfo.InvariantCulture);
|
||||
writer.Write('"');
|
||||
return writer.ToString();
|
||||
}
|
||||
}
|
||||
|
||||
internal static DateTime EnsureDateTime(DateTime value, DateTimeZoneHandling timeZone)
|
||||
{
|
||||
switch (timeZone)
|
||||
{
|
||||
case DateTimeZoneHandling.Local:
|
||||
value = SwitchToLocalTime(value);
|
||||
break;
|
||||
case DateTimeZoneHandling.Utc:
|
||||
value = SwitchToUtcTime(value);
|
||||
break;
|
||||
case DateTimeZoneHandling.Unspecified:
|
||||
value = new DateTime(value.Ticks, DateTimeKind.Unspecified);
|
||||
break;
|
||||
case DateTimeZoneHandling.RoundtripKind:
|
||||
break;
|
||||
default:
|
||||
throw new ArgumentException("Invalid date time handling value.");
|
||||
}
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
#if !NET20
|
||||
/// <summary>
|
||||
/// Converts the <see cref="DateTimeOffset"/> to its JSON string representation.
|
||||
@@ -162,231 +138,13 @@ namespace Newtonsoft.Json
|
||||
using (StringWriter writer = StringUtils.CreateStringWriter(64))
|
||||
{
|
||||
writer.Write('"');
|
||||
WriteDateTimeOffsetString(writer, value, format, null, CultureInfo.InvariantCulture);
|
||||
DateTimeUtils.WriteDateTimeOffsetString(writer, value, format, null, CultureInfo.InvariantCulture);
|
||||
writer.Write('"');
|
||||
return writer.ToString();
|
||||
}
|
||||
}
|
||||
|
||||
internal static void WriteDateTimeOffsetString(TextWriter writer, DateTimeOffset value, DateFormatHandling format, string formatString, CultureInfo culture)
|
||||
{
|
||||
if (string.IsNullOrEmpty(formatString))
|
||||
{
|
||||
WriteDateTimeString(writer, (format == DateFormatHandling.IsoDateFormat) ? value.DateTime : value.UtcDateTime, value.Offset, DateTimeKind.Local, format);
|
||||
}
|
||||
else
|
||||
{
|
||||
writer.Write(value.ToString(formatString, culture));
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
internal static void WriteDateTimeString(TextWriter writer, DateTime value, DateFormatHandling format, string formatString, CultureInfo culture)
|
||||
{
|
||||
if (string.IsNullOrEmpty(formatString))
|
||||
{
|
||||
WriteDateTimeString(writer, value, value.GetUtcOffset(), value.Kind, format);
|
||||
}
|
||||
else
|
||||
{
|
||||
writer.Write(value.ToString(formatString, culture));
|
||||
}
|
||||
}
|
||||
|
||||
internal static void WriteDateTimeString(TextWriter writer, DateTime value, TimeSpan offset, DateTimeKind kind, DateFormatHandling format)
|
||||
{
|
||||
if (format == DateFormatHandling.MicrosoftDateFormat)
|
||||
{
|
||||
long javaScriptTicks = ConvertDateTimeToJavaScriptTicks(value, offset);
|
||||
|
||||
writer.Write(@"\/Date(");
|
||||
writer.Write(javaScriptTicks);
|
||||
|
||||
switch (kind)
|
||||
{
|
||||
case DateTimeKind.Unspecified:
|
||||
if (value != DateTime.MaxValue && value != DateTime.MinValue)
|
||||
WriteDateTimeOffset(writer, offset, format);
|
||||
break;
|
||||
case DateTimeKind.Local:
|
||||
WriteDateTimeOffset(writer, offset, format);
|
||||
break;
|
||||
}
|
||||
|
||||
writer.Write(@")\/");
|
||||
}
|
||||
else
|
||||
{
|
||||
WriteIsoDate(writer, value);
|
||||
|
||||
switch (kind)
|
||||
{
|
||||
case DateTimeKind.Local:
|
||||
WriteDateTimeOffset(writer, offset, format);
|
||||
break;
|
||||
case DateTimeKind.Utc:
|
||||
writer.Write("Z");
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
internal static void WriteIsoDate(TextWriter writer, DateTime dt)
|
||||
{
|
||||
char[] chars = new char[27];
|
||||
int length = 19;
|
||||
|
||||
IntToCharArray(chars, 0, dt.Year, 4);
|
||||
chars[4] = '-';
|
||||
IntToCharArray(chars, 5, dt.Month, 2);
|
||||
chars[7] = '-';
|
||||
IntToCharArray(chars, 8, dt.Day, 2);
|
||||
chars[10] = 'T';
|
||||
IntToCharArray(chars, 11, dt.Hour, 2);
|
||||
chars[13] = ':';
|
||||
IntToCharArray(chars, 14, dt.Minute, 2);
|
||||
chars[16] = ':';
|
||||
IntToCharArray(chars, 17, dt.Second, 2);
|
||||
|
||||
DateTime time = new DateTime(dt.Year, dt.Month, dt.Day, dt.Hour, dt.Minute, dt.Second);
|
||||
int fraction = (int)(dt.Ticks - time.Ticks);
|
||||
|
||||
if (fraction != 0)
|
||||
{
|
||||
int digits = 7;
|
||||
while ((fraction % 10) == 0)
|
||||
{
|
||||
digits--;
|
||||
fraction /= 10;
|
||||
}
|
||||
|
||||
chars[19] = '.';
|
||||
IntToCharArray(chars, 20, fraction, digits);
|
||||
|
||||
length += digits + 1;
|
||||
}
|
||||
|
||||
writer.Write(chars, 0, length);
|
||||
}
|
||||
|
||||
private static void IntToCharArray(char[] text, int start, int value, int digits)
|
||||
{
|
||||
while (digits-- != 0)
|
||||
{
|
||||
text[start + digits] = (char)((value % 10) + 48);
|
||||
value /= 10;
|
||||
}
|
||||
}
|
||||
|
||||
internal static void WriteDateTimeOffset(TextWriter writer, TimeSpan offset, DateFormatHandling format)
|
||||
{
|
||||
writer.Write((offset.Ticks >= 0L) ? "+" : "-");
|
||||
|
||||
int absHours = Math.Abs(offset.Hours);
|
||||
if (absHours < 10)
|
||||
writer.Write(0);
|
||||
writer.Write(absHours);
|
||||
|
||||
if (format == DateFormatHandling.IsoDateFormat)
|
||||
writer.Write(':');
|
||||
|
||||
int absMinutes = Math.Abs(offset.Minutes);
|
||||
if (absMinutes < 10)
|
||||
writer.Write(0);
|
||||
writer.Write(absMinutes);
|
||||
}
|
||||
|
||||
private static long ToUniversalTicks(DateTime dateTime)
|
||||
{
|
||||
if (dateTime.Kind == DateTimeKind.Utc)
|
||||
return dateTime.Ticks;
|
||||
|
||||
return ToUniversalTicks(dateTime, dateTime.GetUtcOffset());
|
||||
}
|
||||
|
||||
private static long ToUniversalTicks(DateTime dateTime, TimeSpan offset)
|
||||
{
|
||||
// special case min and max value
|
||||
// they never have a timezone appended to avoid issues
|
||||
if (dateTime.Kind == DateTimeKind.Utc || dateTime == DateTime.MaxValue || dateTime == DateTime.MinValue)
|
||||
return dateTime.Ticks;
|
||||
|
||||
long ticks = dateTime.Ticks - offset.Ticks;
|
||||
if (ticks > 3155378975999999999L)
|
||||
return 3155378975999999999L;
|
||||
|
||||
if (ticks < 0L)
|
||||
return 0L;
|
||||
|
||||
return ticks;
|
||||
}
|
||||
|
||||
internal static long ConvertDateTimeToJavaScriptTicks(DateTime dateTime, TimeSpan offset)
|
||||
{
|
||||
long universialTicks = ToUniversalTicks(dateTime, offset);
|
||||
|
||||
return UniversialTicksToJavaScriptTicks(universialTicks);
|
||||
}
|
||||
|
||||
internal static long ConvertDateTimeToJavaScriptTicks(DateTime dateTime)
|
||||
{
|
||||
return ConvertDateTimeToJavaScriptTicks(dateTime, true);
|
||||
}
|
||||
|
||||
internal static long ConvertDateTimeToJavaScriptTicks(DateTime dateTime, bool convertToUtc)
|
||||
{
|
||||
long ticks = (convertToUtc) ? ToUniversalTicks(dateTime) : dateTime.Ticks;
|
||||
|
||||
return UniversialTicksToJavaScriptTicks(ticks);
|
||||
}
|
||||
|
||||
private static long UniversialTicksToJavaScriptTicks(long universialTicks)
|
||||
{
|
||||
long javaScriptTicks = (universialTicks - InitialJavaScriptDateTicks)/10000;
|
||||
|
||||
return javaScriptTicks;
|
||||
}
|
||||
|
||||
internal static DateTime ConvertJavaScriptTicksToDateTime(long javaScriptTicks)
|
||||
{
|
||||
DateTime dateTime = new DateTime((javaScriptTicks*10000) + InitialJavaScriptDateTicks, DateTimeKind.Utc);
|
||||
|
||||
return dateTime;
|
||||
}
|
||||
|
||||
private static DateTime SwitchToLocalTime(DateTime value)
|
||||
{
|
||||
switch (value.Kind)
|
||||
{
|
||||
case DateTimeKind.Unspecified:
|
||||
return new DateTime(value.Ticks, DateTimeKind.Local);
|
||||
|
||||
case DateTimeKind.Utc:
|
||||
return value.ToLocalTime();
|
||||
|
||||
case DateTimeKind.Local:
|
||||
return value;
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
||||
private static DateTime SwitchToUtcTime(DateTime value)
|
||||
{
|
||||
switch (value.Kind)
|
||||
{
|
||||
case DateTimeKind.Unspecified:
|
||||
return new DateTime(value.Ticks, DateTimeKind.Utc);
|
||||
|
||||
case DateTimeKind.Utc:
|
||||
return value;
|
||||
|
||||
case DateTimeKind.Local:
|
||||
return value.ToUniversalTime();
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Converts the <see cref="Boolean"/> to its JSON string representation.
|
||||
/// </summary>
|
||||
@@ -740,126 +498,6 @@ namespace Newtonsoft.Json
|
||||
return false;
|
||||
}
|
||||
|
||||
internal static bool TryParseDateTime(string s, DateParseHandling dateParseHandling, DateTimeZoneHandling dateTimeZoneHandling, out object dt)
|
||||
{
|
||||
if (s.Length > 0)
|
||||
{
|
||||
if (s[0] == '/')
|
||||
{
|
||||
if (s.StartsWith("/Date(", StringComparison.Ordinal) && s.EndsWith(")/", StringComparison.Ordinal))
|
||||
{
|
||||
return TryParseDateMicrosoft(s, dateParseHandling, dateTimeZoneHandling, out dt);
|
||||
}
|
||||
}
|
||||
else if (char.IsDigit(s[0]) && s.Length >= 19 && s.Length <= 40)
|
||||
{
|
||||
return TryParseDateIso(s, dateParseHandling, dateTimeZoneHandling, out dt);
|
||||
}
|
||||
}
|
||||
|
||||
dt = null;
|
||||
return false;
|
||||
}
|
||||
|
||||
private static bool TryParseDateIso(string text, DateParseHandling dateParseHandling, DateTimeZoneHandling dateTimeZoneHandling, out object dt)
|
||||
{
|
||||
const string isoDateFormat = "yyyy-MM-ddTHH:mm:ss.FFFFFFFK";
|
||||
|
||||
#if !NET20
|
||||
if (dateParseHandling == DateParseHandling.DateTimeOffset)
|
||||
{
|
||||
DateTimeOffset dateTimeOffset;
|
||||
if (DateTimeOffset.TryParseExact(text, isoDateFormat, CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind, out dateTimeOffset))
|
||||
{
|
||||
dt = dateTimeOffset;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
DateTime dateTime;
|
||||
if (DateTime.TryParseExact(text, isoDateFormat, CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind, out dateTime))
|
||||
{
|
||||
dateTime = EnsureDateTime(dateTime, dateTimeZoneHandling);
|
||||
|
||||
dt = dateTime;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
dt = null;
|
||||
return false;
|
||||
}
|
||||
|
||||
private static bool TryParseDateMicrosoft(string text, DateParseHandling dateParseHandling, DateTimeZoneHandling dateTimeZoneHandling, out object dt)
|
||||
{
|
||||
string value = text.Substring(6, text.Length - 8);
|
||||
DateTimeKind kind = DateTimeKind.Utc;
|
||||
|
||||
int index = value.IndexOf('+', 1);
|
||||
|
||||
if (index == -1)
|
||||
index = value.IndexOf('-', 1);
|
||||
|
||||
TimeSpan offset = TimeSpan.Zero;
|
||||
|
||||
if (index != -1)
|
||||
{
|
||||
kind = DateTimeKind.Local;
|
||||
offset = ReadOffset(value.Substring(index));
|
||||
value = value.Substring(0, index);
|
||||
}
|
||||
|
||||
long javaScriptTicks = long.Parse(value, NumberStyles.Integer, CultureInfo.InvariantCulture);
|
||||
|
||||
DateTime utcDateTime = ConvertJavaScriptTicksToDateTime(javaScriptTicks);
|
||||
|
||||
#if !NET20
|
||||
if (dateParseHandling == DateParseHandling.DateTimeOffset)
|
||||
{
|
||||
dt = new DateTimeOffset(utcDateTime.Add(offset).Ticks, offset);
|
||||
return true;
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
DateTime dateTime;
|
||||
|
||||
switch (kind)
|
||||
{
|
||||
case DateTimeKind.Unspecified:
|
||||
dateTime = DateTime.SpecifyKind(utcDateTime.ToLocalTime(), DateTimeKind.Unspecified);
|
||||
break;
|
||||
case DateTimeKind.Local:
|
||||
dateTime = utcDateTime.ToLocalTime();
|
||||
break;
|
||||
default:
|
||||
dateTime = utcDateTime;
|
||||
break;
|
||||
}
|
||||
|
||||
dt = EnsureDateTime(dateTime, dateTimeZoneHandling);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
private static TimeSpan ReadOffset(string offsetText)
|
||||
{
|
||||
bool negative = (offsetText[0] == '-');
|
||||
|
||||
int hours = int.Parse(offsetText.Substring(1, 2), NumberStyles.Integer, CultureInfo.InvariantCulture);
|
||||
int minutes = 0;
|
||||
if (offsetText.Length >= 5)
|
||||
minutes = int.Parse(offsetText.Substring(3, 2), NumberStyles.Integer, CultureInfo.InvariantCulture);
|
||||
|
||||
TimeSpan offset = TimeSpan.FromHours(hours) + TimeSpan.FromMinutes(minutes);
|
||||
if (negative)
|
||||
offset = offset.Negate();
|
||||
|
||||
return offset;
|
||||
}
|
||||
|
||||
#region Serialize
|
||||
/// <summary>
|
||||
/// Serializes the specified object to a JSON string.
|
||||
|
||||
@@ -700,7 +700,7 @@ namespace Newtonsoft.Json
|
||||
|
||||
if (DateTime.TryParse(s, Culture, DateTimeStyles.RoundtripKind, out dt))
|
||||
{
|
||||
dt = JsonConvert.EnsureDateTime(dt, DateTimeZoneHandling);
|
||||
dt = DateTimeUtils.EnsureDateTime(dt, DateTimeZoneHandling);
|
||||
SetToken(JsonToken.Date, dt);
|
||||
return dt;
|
||||
}
|
||||
|
||||
@@ -42,22 +42,23 @@ namespace Newtonsoft.Json
|
||||
/// </summary>
|
||||
public class JsonSerializer
|
||||
{
|
||||
#region Properties
|
||||
private TypeNameHandling _typeNameHandling;
|
||||
private FormatterAssemblyStyle _typeNameAssemblyFormat;
|
||||
private PreserveReferencesHandling _preserveReferencesHandling;
|
||||
private ReferenceLoopHandling _referenceLoopHandling;
|
||||
private MissingMemberHandling _missingMemberHandling;
|
||||
private ObjectCreationHandling _objectCreationHandling;
|
||||
private NullValueHandling _nullValueHandling;
|
||||
private DefaultValueHandling _defaultValueHandling;
|
||||
private ConstructorHandling _constructorHandling;
|
||||
private JsonConverterCollection _converters;
|
||||
private IContractResolver _contractResolver;
|
||||
#region Properties_binder
|
||||
internal TypeNameHandling _typeNameHandling;
|
||||
internal FormatterAssemblyStyle _typeNameAssemblyFormat;
|
||||
internal PreserveReferencesHandling _preserveReferencesHandling;
|
||||
internal ReferenceLoopHandling _referenceLoopHandling;
|
||||
internal MissingMemberHandling _missingMemberHandling;
|
||||
internal ObjectCreationHandling _objectCreationHandling;
|
||||
internal NullValueHandling _nullValueHandling;
|
||||
internal DefaultValueHandling _defaultValueHandling;
|
||||
internal ConstructorHandling _constructorHandling;
|
||||
internal JsonConverterCollection _converters;
|
||||
internal IContractResolver _contractResolver;
|
||||
internal ITraceWriter _traceWriter;
|
||||
internal SerializationBinder _binder;
|
||||
internal StreamingContext _context;
|
||||
private IReferenceResolver _referenceResolver;
|
||||
private ITraceWriter _traceWriter;
|
||||
private SerializationBinder _binder;
|
||||
private StreamingContext _context;
|
||||
|
||||
private Formatting? _formatting;
|
||||
private DateFormatHandling? _dateFormatHandling;
|
||||
private DateTimeZoneHandling? _dateTimeZoneHandling;
|
||||
@@ -82,13 +83,7 @@ namespace Newtonsoft.Json
|
||||
/// </summary>
|
||||
public virtual IReferenceResolver ReferenceResolver
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_referenceResolver == null)
|
||||
_referenceResolver = new DefaultReferenceResolver();
|
||||
|
||||
return _referenceResolver;
|
||||
}
|
||||
get { return GetReferenceResolver(); }
|
||||
set
|
||||
{
|
||||
if (value == null)
|
||||
@@ -291,14 +286,8 @@ namespace Newtonsoft.Json
|
||||
/// </summary>
|
||||
public virtual IContractResolver ContractResolver
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_contractResolver == null)
|
||||
_contractResolver = DefaultContractResolver.Instance;
|
||||
|
||||
return _contractResolver;
|
||||
}
|
||||
set { _contractResolver = value; }
|
||||
get { return _contractResolver; }
|
||||
set { _contractResolver = value ?? DefaultContractResolver.Instance; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -448,6 +437,9 @@ namespace Newtonsoft.Json
|
||||
_typeNameHandling = JsonSerializerSettings.DefaultTypeNameHandling;
|
||||
_context = JsonSerializerSettings.DefaultContext;
|
||||
_binder = DefaultSerializationBinder.Instance;
|
||||
|
||||
_culture = JsonSerializerSettings.DefaultCulture;
|
||||
_contractResolver = DefaultContractResolver.Instance;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -769,6 +761,14 @@ namespace Newtonsoft.Json
|
||||
jsonWriter.Culture = previousCulture;
|
||||
}
|
||||
|
||||
internal IReferenceResolver GetReferenceResolver()
|
||||
{
|
||||
if (_referenceResolver == null)
|
||||
_referenceResolver = new DefaultReferenceResolver();
|
||||
|
||||
return _referenceResolver;
|
||||
}
|
||||
|
||||
internal JsonConverter GetMatchingConverter(Type type)
|
||||
{
|
||||
return GetMatchingConverter(_converters, type);
|
||||
|
||||
@@ -78,7 +78,7 @@ namespace Newtonsoft.Json
|
||||
|
||||
_reader = reader;
|
||||
_lineNumber = 1;
|
||||
_chars = new char[2049];
|
||||
_chars = new char[1025];
|
||||
}
|
||||
|
||||
#if DEBUG
|
||||
@@ -92,7 +92,7 @@ namespace Newtonsoft.Json
|
||||
{
|
||||
if (_buffer == null)
|
||||
{
|
||||
_buffer = new StringBuffer(2048);
|
||||
_buffer = new StringBuffer(1025);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -153,7 +153,7 @@ namespace Newtonsoft.Json
|
||||
dateParseHandling = _dateParseHandling;
|
||||
|
||||
object dt;
|
||||
if (JsonConvert.TryParseDateTime(text, dateParseHandling, DateTimeZoneHandling, out dt))
|
||||
if (DateTimeUtils.TryParseDateTime(text, dateParseHandling, DateTimeZoneHandling, out dt))
|
||||
{
|
||||
SetToken(JsonToken.Date, dt);
|
||||
return;
|
||||
|
||||
@@ -48,6 +48,7 @@ namespace Newtonsoft.Json
|
||||
private char _quoteChar;
|
||||
private bool _quoteName;
|
||||
private bool[] _charEscapeFlags;
|
||||
private char[] _writeBuffer;
|
||||
|
||||
private Base64Encoder Base64Encoder
|
||||
{
|
||||
@@ -373,7 +374,7 @@ namespace Newtonsoft.Json
|
||||
public override void WriteValue(int value)
|
||||
{
|
||||
InternalWriteValue(JsonToken.Integer);
|
||||
WriteValueInternal(JsonConvert.ToString(value), JsonToken.Integer);
|
||||
WriteIntegerValue(value);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -384,7 +385,7 @@ namespace Newtonsoft.Json
|
||||
public override void WriteValue(uint value)
|
||||
{
|
||||
InternalWriteValue(JsonToken.Integer);
|
||||
WriteValueInternal(JsonConvert.ToString(value), JsonToken.Integer);
|
||||
WriteIntegerValue(value);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -394,7 +395,7 @@ namespace Newtonsoft.Json
|
||||
public override void WriteValue(long value)
|
||||
{
|
||||
InternalWriteValue(JsonToken.Integer);
|
||||
WriteValueInternal(JsonConvert.ToString(value), JsonToken.Integer);
|
||||
WriteIntegerValue(value);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -405,7 +406,7 @@ namespace Newtonsoft.Json
|
||||
public override void WriteValue(ulong value)
|
||||
{
|
||||
InternalWriteValue(JsonToken.Integer);
|
||||
WriteValueInternal(JsonConvert.ToString(value), JsonToken.Integer);
|
||||
WriteIntegerValue(value);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -479,7 +480,7 @@ namespace Newtonsoft.Json
|
||||
public override void WriteValue(short value)
|
||||
{
|
||||
InternalWriteValue(JsonToken.Integer);
|
||||
WriteValueInternal(JsonConvert.ToString(value), JsonToken.Integer);
|
||||
WriteIntegerValue(value);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -490,7 +491,7 @@ namespace Newtonsoft.Json
|
||||
public override void WriteValue(ushort value)
|
||||
{
|
||||
InternalWriteValue(JsonToken.Integer);
|
||||
WriteValueInternal(JsonConvert.ToString(value), JsonToken.Integer);
|
||||
WriteIntegerValue(value);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -510,7 +511,7 @@ namespace Newtonsoft.Json
|
||||
public override void WriteValue(byte value)
|
||||
{
|
||||
InternalWriteValue(JsonToken.Integer);
|
||||
WriteValueInternal(JsonConvert.ToString(value), JsonToken.Integer);
|
||||
WriteIntegerValue(value);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -521,7 +522,7 @@ namespace Newtonsoft.Json
|
||||
public override void WriteValue(sbyte value)
|
||||
{
|
||||
InternalWriteValue(JsonToken.Integer);
|
||||
WriteValueInternal(JsonConvert.ToString(value), JsonToken.Integer);
|
||||
WriteIntegerValue(value);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -541,10 +542,25 @@ namespace Newtonsoft.Json
|
||||
public override void WriteValue(DateTime value)
|
||||
{
|
||||
InternalWriteValue(JsonToken.Date);
|
||||
value = JsonConvert.EnsureDateTime(value, DateTimeZoneHandling);
|
||||
_writer.Write(_quoteChar);
|
||||
JsonConvert.WriteDateTimeString(_writer, value, DateFormatHandling, DateFormatString, Culture);
|
||||
_writer.Write(_quoteChar);
|
||||
value = DateTimeUtils.EnsureDateTime(value, DateTimeZoneHandling);
|
||||
|
||||
if (string.IsNullOrEmpty(DateFormatString))
|
||||
{
|
||||
EnsureWriteBuffer();
|
||||
|
||||
int pos = 0;
|
||||
_writeBuffer[pos++] = _quoteChar;
|
||||
pos = DateTimeUtils.WriteDateTimeString(_writeBuffer, pos, value, null, value.Kind, DateFormatHandling);
|
||||
_writeBuffer[pos++] = _quoteChar;
|
||||
|
||||
_writer.Write(_writeBuffer, 0, pos);
|
||||
}
|
||||
else
|
||||
{
|
||||
_writer.Write(_quoteChar);
|
||||
_writer.Write(value.ToString(DateFormatString, Culture));
|
||||
_writer.Write(_quoteChar);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -575,9 +591,24 @@ namespace Newtonsoft.Json
|
||||
public override void WriteValue(DateTimeOffset value)
|
||||
{
|
||||
InternalWriteValue(JsonToken.Date);
|
||||
_writer.Write(_quoteChar);
|
||||
JsonConvert.WriteDateTimeOffsetString(_writer, value, DateFormatHandling, DateFormatString, Culture);
|
||||
_writer.Write(_quoteChar);
|
||||
|
||||
if (string.IsNullOrEmpty(DateFormatString))
|
||||
{
|
||||
EnsureWriteBuffer();
|
||||
|
||||
int pos = 0;
|
||||
_writeBuffer[pos++] = _quoteChar;
|
||||
pos = DateTimeUtils.WriteDateTimeString(_writeBuffer, pos, (DateFormatHandling == DateFormatHandling.IsoDateFormat) ? value.DateTime : value.UtcDateTime, value.Offset, DateTimeKind.Local, DateFormatHandling);
|
||||
_writeBuffer[pos++] = _quoteChar;
|
||||
|
||||
_writer.Write(_writeBuffer, 0, pos);
|
||||
}
|
||||
else
|
||||
{
|
||||
_writer.Write(_quoteChar);
|
||||
_writer.Write(value.ToString(DateFormatString, Culture));
|
||||
_writer.Write(_quoteChar);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -642,5 +673,93 @@ namespace Newtonsoft.Json
|
||||
|
||||
_writer.Write(ws);
|
||||
}
|
||||
|
||||
private void EnsureWriteBuffer()
|
||||
{
|
||||
if (_writeBuffer == null)
|
||||
_writeBuffer = new char[64];
|
||||
}
|
||||
|
||||
private void WriteIntegerValue(int value)
|
||||
{
|
||||
EnsureWriteBuffer();
|
||||
|
||||
if (value >= 0 && value <= 9)
|
||||
{
|
||||
_writer.Write((char)(48 + value));
|
||||
}
|
||||
else
|
||||
{
|
||||
int length = 0;
|
||||
|
||||
uint uvalue = (value < 0) ? (uint)-value : (uint)value;
|
||||
|
||||
do
|
||||
{
|
||||
_writeBuffer[length++] = (char)(48 + (uvalue % 10));
|
||||
uvalue /= 10;
|
||||
} while (uvalue != 0);
|
||||
|
||||
if (value < 0)
|
||||
_writeBuffer[length++] = '-';
|
||||
|
||||
Array.Reverse(_writeBuffer, 0, length);
|
||||
|
||||
_writer.Write(_writeBuffer, 0, length);
|
||||
}
|
||||
}
|
||||
|
||||
private void WriteIntegerValue(long value)
|
||||
{
|
||||
EnsureWriteBuffer();
|
||||
|
||||
if (value >= 0 && value <= 9)
|
||||
{
|
||||
_writer.Write((char)(48 + value));
|
||||
}
|
||||
else
|
||||
{
|
||||
int length = 0;
|
||||
|
||||
ulong uvalue = (value < 0) ? (ulong)-value : (ulong)value;
|
||||
|
||||
do
|
||||
{
|
||||
_writeBuffer[length++] = (char)(48 + (uvalue % 10));
|
||||
uvalue /= 10;
|
||||
} while (uvalue != 0);
|
||||
|
||||
if (value < 0)
|
||||
_writeBuffer[length++] = '-';
|
||||
|
||||
Array.Reverse(_writeBuffer, 0, length);
|
||||
|
||||
_writer.Write(_writeBuffer, 0, length);
|
||||
}
|
||||
}
|
||||
|
||||
private void WriteIntegerValue(ulong uvalue)
|
||||
{
|
||||
EnsureWriteBuffer();
|
||||
|
||||
if (uvalue <= 9)
|
||||
{
|
||||
_writer.Write((char)(48 + uvalue));
|
||||
}
|
||||
else
|
||||
{
|
||||
int length = 0;
|
||||
|
||||
do
|
||||
{
|
||||
_writeBuffer[length++] = (char)(48 + (uvalue % 10));
|
||||
uvalue /= 10;
|
||||
} while (uvalue != 0);
|
||||
|
||||
Array.Reverse(_writeBuffer, 0, length);
|
||||
|
||||
_writer.Write(_writeBuffer, 0, length);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -572,7 +572,7 @@ namespace Newtonsoft.Json
|
||||
throw JsonWriterException.Create(this, "Unexpected token when reading date constructor. Expected Integer, got " + reader.TokenType, null);
|
||||
|
||||
long ticks = (long)reader.Value;
|
||||
DateTime date = JsonConvert.ConvertJavaScriptTicksToDateTime(ticks);
|
||||
DateTime date = DateTimeUtils.ConvertJavaScriptTicksToDateTime(ticks);
|
||||
|
||||
if (!reader.Read())
|
||||
throw JsonWriterException.Create(this, "Unexpected end when reading date constructor.", null);
|
||||
|
||||
@@ -396,7 +396,7 @@ namespace Newtonsoft.Json.Linq
|
||||
public override void WriteValue(DateTime value)
|
||||
{
|
||||
base.WriteValue(value);
|
||||
value = JsonConvert.EnsureDateTime(value, DateTimeZoneHandling);
|
||||
value = DateTimeUtils.EnsureDateTime(value, DateTimeZoneHandling);
|
||||
AddValue(value, JsonToken.Date);
|
||||
}
|
||||
|
||||
|
||||
@@ -113,6 +113,7 @@
|
||||
<Compile Include="Serialization\MemoryTraceWriter.cs" />
|
||||
<Compile Include="StreamingContext.cs" />
|
||||
<Compile Include="StringEscapeHandling.cs" />
|
||||
<Compile Include="Utilities\DateTimeParser.cs" />
|
||||
<Compile Include="Utilities\LinqBridge.cs" />
|
||||
<Compile Include="Linq\JPath.cs" />
|
||||
<Compile Include="Linq\JPropertyDescriptor.cs" />
|
||||
|
||||
@@ -125,6 +125,7 @@
|
||||
<Compile Include="StreamingContext.cs" />
|
||||
<Compile Include="StringEscapeHandling.cs" />
|
||||
<Compile Include="TraceLevel.cs" />
|
||||
<Compile Include="Utilities\DateTimeParser.cs" />
|
||||
<Compile Include="Utilities\DynamicProxy.cs" />
|
||||
<Compile Include="Linq\JPath.cs" />
|
||||
<Compile Include="Linq\JRaw.cs" />
|
||||
|
||||
@@ -57,6 +57,7 @@
|
||||
<CodeAnalysisRules>
|
||||
</CodeAnalysisRules>
|
||||
<CodeAnalysisRuleSet>Newtonsoft.Json.ruleset</CodeAnalysisRuleSet>
|
||||
<UseVSHostingProcess>true</UseVSHostingProcess>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||
<DebugType>pdbonly</DebugType>
|
||||
@@ -122,6 +123,7 @@
|
||||
<Compile Include="Serialization\JsonContainerContract.cs" />
|
||||
<Compile Include="Serialization\MemoryTraceWriter.cs" />
|
||||
<Compile Include="StringEscapeHandling.cs" />
|
||||
<Compile Include="Utilities\DateTimeParser.cs" />
|
||||
<Compile Include="Utilities\DynamicProxy.cs" />
|
||||
<Compile Include="Linq\JPath.cs" />
|
||||
<Compile Include="Linq\JRaw.cs" />
|
||||
|
||||
@@ -190,6 +190,7 @@
|
||||
<Compile Include="Utilities\CollectionUtils.cs" />
|
||||
<Compile Include="Utilities\CollectionWrapper.cs" />
|
||||
<Compile Include="Utilities\ConvertUtils.cs" />
|
||||
<Compile Include="Utilities\DateTimeParser.cs" />
|
||||
<Compile Include="Utilities\DateTimeUtils.cs" />
|
||||
<Compile Include="Utilities\DictionaryWrapper.cs" />
|
||||
<Compile Include="Utilities\DynamicProxy.cs" />
|
||||
|
||||
@@ -190,6 +190,7 @@
|
||||
<Compile Include="Utilities\CollectionUtils.cs" />
|
||||
<Compile Include="Utilities\CollectionWrapper.cs" />
|
||||
<Compile Include="Utilities\ConvertUtils.cs" />
|
||||
<Compile Include="Utilities\DateTimeParser.cs" />
|
||||
<Compile Include="Utilities\DateTimeUtils.cs" />
|
||||
<Compile Include="Utilities\DictionaryWrapper.cs" />
|
||||
<Compile Include="Utilities\DynamicProxy.cs" />
|
||||
|
||||
@@ -190,6 +190,7 @@
|
||||
<Compile Include="Utilities\CollectionUtils.cs" />
|
||||
<Compile Include="Utilities\CollectionWrapper.cs" />
|
||||
<Compile Include="Utilities\ConvertUtils.cs" />
|
||||
<Compile Include="Utilities\DateTimeParser.cs" />
|
||||
<Compile Include="Utilities\DateTimeUtils.cs" />
|
||||
<Compile Include="Utilities\DictionaryWrapper.cs" />
|
||||
<Compile Include="Utilities\DynamicProxy.cs" />
|
||||
|
||||
@@ -92,6 +92,6 @@ using System.Security;
|
||||
// You can specify all the values or you can default the Revision and Build Numbers
|
||||
// by using the '*' as shown below:
|
||||
[assembly: AssemblyVersion("4.5.0.0")]
|
||||
[assembly: AssemblyFileVersion("5.0.1.16008")]
|
||||
[assembly: AssemblyFileVersion("5.0.4.16021")]
|
||||
|
||||
[assembly: CLSCompliant(true)]
|
||||
|
||||
@@ -71,6 +71,7 @@ namespace Newtonsoft.Json.Serialization
|
||||
internal bool IsNullable;
|
||||
internal bool IsConvertable;
|
||||
internal bool IsSealed;
|
||||
internal bool IsEnum;
|
||||
internal Type NonNullableUnderlyingType;
|
||||
internal ReadType InternalReadType;
|
||||
internal JsonContractType ContractType;
|
||||
@@ -286,7 +287,7 @@ namespace Newtonsoft.Json.Serialization
|
||||
CreatedType = NonNullableUnderlyingType;
|
||||
|
||||
IsConvertable = ConvertUtils.IsConvertible(NonNullableUnderlyingType);
|
||||
|
||||
IsEnum = NonNullableUnderlyingType.IsEnum();
|
||||
|
||||
if (NonNullableUnderlyingType == typeof(byte[]))
|
||||
{
|
||||
|
||||
@@ -73,7 +73,7 @@ namespace Newtonsoft.Json.Serialization
|
||||
|
||||
Type objectType = target.GetType();
|
||||
|
||||
JsonContract contract = Serializer.ContractResolver.ResolveContract(objectType);
|
||||
JsonContract contract = Serializer._contractResolver.ResolveContract(objectType);
|
||||
|
||||
if (reader.TokenType == JsonToken.None)
|
||||
reader.Read();
|
||||
@@ -128,7 +128,7 @@ namespace Newtonsoft.Json.Serialization
|
||||
if (type == null)
|
||||
return null;
|
||||
|
||||
return Serializer.ContractResolver.ResolveContract(type);
|
||||
return Serializer._contractResolver.ResolveContract(type);
|
||||
}
|
||||
|
||||
public object Deserialize(JsonReader reader, Type objectType, bool checkAdditionalContent)
|
||||
@@ -496,7 +496,7 @@ To fix this error either change the JSON to a {1} or change the deserialized typ
|
||||
if (reader.TokenType == JsonToken.PropertyName)
|
||||
throw JsonSerializationException.Create(reader, "Additional content found in JSON reference object. A JSON reference object should only have a {0} property.".FormatWith(CultureInfo.InvariantCulture, JsonTypeReflector.RefPropertyName));
|
||||
|
||||
newValue = Serializer.ReferenceResolver.ResolveReference(this, reference);
|
||||
newValue = Serializer.GetReferenceResolver().ResolveReference(this, reference);
|
||||
|
||||
if (TraceWriter != null && TraceWriter.LevelFilter >= TraceLevel.Info)
|
||||
TraceWriter.Trace(TraceLevel.Info, JsonPosition.FormatMessage(reader as IJsonLineInfo, reader.Path, "Resolved object reference '{0}' to {1}.".FormatWith(CultureInfo.InvariantCulture, reference, newValue.GetType())), null);
|
||||
@@ -517,7 +517,7 @@ To fix this error either change the JSON to a {1} or change the deserialized typ
|
||||
((member != null) ? member.TypeNameHandling : null)
|
||||
?? ((containerContract != null) ? containerContract.ItemTypeNameHandling : null)
|
||||
?? ((containerMember != null) ? containerMember.ItemTypeNameHandling : null)
|
||||
?? Serializer.TypeNameHandling;
|
||||
?? Serializer._typeNameHandling;
|
||||
|
||||
if (resolvedTypeNameHandling != TypeNameHandling.None)
|
||||
{
|
||||
@@ -528,7 +528,7 @@ To fix this error either change the JSON to a {1} or change the deserialized typ
|
||||
Type specifiedType;
|
||||
try
|
||||
{
|
||||
specifiedType = Serializer.Binder.BindToType(assemblyName, typeName);
|
||||
specifiedType = Serializer._binder.BindToType(assemblyName, typeName);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
@@ -697,7 +697,7 @@ To fix this error either change the JSON to a {1} or change the deserialized typ
|
||||
{
|
||||
JsonPrimitiveContract primitiveContract = (JsonPrimitiveContract)contract;
|
||||
|
||||
if (contract.NonNullableUnderlyingType.IsEnum())
|
||||
if (contract.IsEnum)
|
||||
{
|
||||
if (value is string)
|
||||
return Enum.Parse(contract.NonNullableUnderlyingType, value.ToString(), true);
|
||||
@@ -786,7 +786,7 @@ To fix this error either change the JSON to a {1} or change the deserialized typ
|
||||
property.PropertyContract = GetContractSafe(property.PropertyType);
|
||||
|
||||
ObjectCreationHandling objectCreationHandling =
|
||||
property.ObjectCreationHandling.GetValueOrDefault(Serializer.ObjectCreationHandling);
|
||||
property.ObjectCreationHandling.GetValueOrDefault(Serializer._objectCreationHandling);
|
||||
|
||||
if ((objectCreationHandling != ObjectCreationHandling.Replace)
|
||||
&& (tokenType == JsonToken.StartArray || tokenType == JsonToken.StartObject)
|
||||
@@ -810,14 +810,14 @@ To fix this error either change the JSON to a {1} or change the deserialized typ
|
||||
}
|
||||
|
||||
// test tokentype here because null might not be convertable to some types, e.g. ignoring null when applied to DateTime
|
||||
if (property.NullValueHandling.GetValueOrDefault(Serializer.NullValueHandling) == NullValueHandling.Ignore && tokenType == JsonToken.Null)
|
||||
if (property.NullValueHandling.GetValueOrDefault(Serializer._nullValueHandling) == NullValueHandling.Ignore && tokenType == JsonToken.Null)
|
||||
{
|
||||
reader.Skip();
|
||||
return true;
|
||||
}
|
||||
|
||||
// test tokentype here because default value might not be convertable to actual type, e.g. default of "" for DateTime
|
||||
if (HasFlag(property.DefaultValueHandling.GetValueOrDefault(Serializer.DefaultValueHandling), DefaultValueHandling.Ignore)
|
||||
if (HasFlag(property.DefaultValueHandling.GetValueOrDefault(Serializer._defaultValueHandling), DefaultValueHandling.Ignore)
|
||||
&& JsonReader.IsPrimitiveToken(tokenType)
|
||||
&& MiscellaneousUtils.ValueEquals(reader.Value, property.GetResolvedDefaultValue()))
|
||||
{
|
||||
@@ -847,7 +847,7 @@ To fix this error either change the JSON to a {1} or change the deserialized typ
|
||||
if (TraceWriter != null && TraceWriter.LevelFilter >= TraceLevel.Verbose)
|
||||
TraceWriter.Trace(TraceLevel.Verbose, JsonPosition.FormatMessage(reader as IJsonLineInfo, reader.Path, "Read object reference Id '{0}' for {1}.".FormatWith(CultureInfo.InvariantCulture, id, value.GetType())), null);
|
||||
|
||||
Serializer.ReferenceResolver.AddReference(this, id, value);
|
||||
Serializer.GetReferenceResolver().AddReference(this, id, value);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
@@ -862,10 +862,10 @@ To fix this error either change the JSON to a {1} or change the deserialized typ
|
||||
|
||||
private bool ShouldSetPropertyValue(JsonProperty property, object value)
|
||||
{
|
||||
if (property.NullValueHandling.GetValueOrDefault(Serializer.NullValueHandling) == NullValueHandling.Ignore && value == null)
|
||||
if (property.NullValueHandling.GetValueOrDefault(Serializer._nullValueHandling) == NullValueHandling.Ignore && value == null)
|
||||
return false;
|
||||
|
||||
if (HasFlag(property.DefaultValueHandling.GetValueOrDefault(Serializer.DefaultValueHandling), DefaultValueHandling.Ignore)
|
||||
if (HasFlag(property.DefaultValueHandling.GetValueOrDefault(Serializer._defaultValueHandling), DefaultValueHandling.Ignore)
|
||||
&& MiscellaneousUtils.ValueEquals(value, property.GetResolvedDefaultValue()))
|
||||
return false;
|
||||
|
||||
@@ -891,7 +891,7 @@ To fix this error either change the JSON to a {1} or change the deserialized typ
|
||||
|
||||
return list;
|
||||
}
|
||||
else if (contract.DefaultCreator != null && (!contract.DefaultCreatorNonPublic || Serializer.ConstructorHandling == ConstructorHandling.AllowNonPublicDefaultConstructor))
|
||||
else if (contract.DefaultCreator != null && (!contract.DefaultCreatorNonPublic || Serializer._constructorHandling == ConstructorHandling.AllowNonPublicDefaultConstructor))
|
||||
{
|
||||
object list = contract.DefaultCreator();
|
||||
|
||||
@@ -919,7 +919,7 @@ To fix this error either change the JSON to a {1} or change the deserialized typ
|
||||
createdFromNonDefaultConstructor = true;
|
||||
return contract.CreateTemporaryDictionary();
|
||||
}
|
||||
else if (contract.DefaultCreator != null && (!contract.DefaultCreatorNonPublic || Serializer.ConstructorHandling == ConstructorHandling.AllowNonPublicDefaultConstructor))
|
||||
else if (contract.DefaultCreator != null && (!contract.DefaultCreatorNonPublic || Serializer._constructorHandling == ConstructorHandling.AllowNonPublicDefaultConstructor))
|
||||
{
|
||||
object dictionary = contract.DefaultCreator();
|
||||
|
||||
@@ -945,7 +945,7 @@ To fix this error either change the JSON to a {1} or change the deserialized typ
|
||||
if (TraceWriter != null && TraceWriter.LevelFilter >= TraceLevel.Info)
|
||||
TraceWriter.Trace(TraceLevel.Info, JsonPosition.FormatMessage(reader as IJsonLineInfo, reader.Path, "Started deserializing {0}".FormatWith(CultureInfo.InvariantCulture, contract.UnderlyingType)), null);
|
||||
|
||||
contract.InvokeOnDeserializing(value, Serializer.Context);
|
||||
contract.InvokeOnDeserializing(value, Serializer._context);
|
||||
}
|
||||
|
||||
private void OnDeserialized(JsonReader reader, JsonContract contract, object value)
|
||||
@@ -953,7 +953,7 @@ To fix this error either change the JSON to a {1} or change the deserialized typ
|
||||
if (TraceWriter != null && TraceWriter.LevelFilter >= TraceLevel.Info)
|
||||
TraceWriter.Trace(TraceLevel.Info, JsonPosition.FormatMessage(reader as IJsonLineInfo, reader.Path, "Finished deserializing {0}".FormatWith(CultureInfo.InvariantCulture, contract.UnderlyingType)), null);
|
||||
|
||||
contract.InvokeOnDeserialized(value, Serializer.Context);
|
||||
contract.InvokeOnDeserialized(value, Serializer._context);
|
||||
}
|
||||
|
||||
private object PopulateDictionary(IDictionary dictionary, JsonReader reader, JsonDictionaryContract contract, JsonProperty containerProperty, string id)
|
||||
@@ -990,12 +990,12 @@ To fix this error either change the JSON to a {1} or change the deserialized typ
|
||||
{
|
||||
// this is for correctly reading ISO and MS formatted dictionary keys
|
||||
if ((keyTypeCode == PrimitiveTypeCode.DateTime || keyTypeCode == PrimitiveTypeCode.DateTimeNullable)
|
||||
&& JsonConvert.TryParseDateTime(keyValue.ToString(), DateParseHandling.DateTime, reader.DateTimeZoneHandling, out keyValue))
|
||||
&& DateTimeUtils.TryParseDateTime(keyValue.ToString(), DateParseHandling.DateTime, reader.DateTimeZoneHandling, out keyValue))
|
||||
{
|
||||
}
|
||||
#if !NET20
|
||||
else if ((keyTypeCode == PrimitiveTypeCode.DateTimeOffset || keyTypeCode == PrimitiveTypeCode.DateTimeOffsetNullable)
|
||||
&& JsonConvert.TryParseDateTime(keyValue.ToString(), DateParseHandling.DateTimeOffset, reader.DateTimeZoneHandling, out keyValue))
|
||||
&& DateTimeUtils.TryParseDateTime(keyValue.ToString(), DateParseHandling.DateTimeOffset, reader.DateTimeZoneHandling, out keyValue))
|
||||
{
|
||||
}
|
||||
#endif
|
||||
@@ -1316,7 +1316,7 @@ To fix this error either change the environment to be fully trusted, change the
|
||||
if (contract.ISerializableCreator == null)
|
||||
throw JsonSerializationException.Create(reader, "ISerializable type '{0}' does not have a valid constructor. To correctly implement ISerializable a constructor that takes SerializationInfo and StreamingContext parameters should be present.".FormatWith(CultureInfo.InvariantCulture, objectType));
|
||||
|
||||
object createdObject = contract.ISerializableCreator(serializationInfo, Serializer.Context);
|
||||
object createdObject = contract.ISerializableCreator(serializationInfo, Serializer._context);
|
||||
|
||||
if (id != null)
|
||||
AddReference(reader, id, createdObject);
|
||||
@@ -1338,7 +1338,7 @@ To fix this error either change the environment to be fully trusted, change the
|
||||
throw JsonSerializationException.Create(reader, "Could not create an instance of type {0}. Type is an interface or abstract class and cannot be instantiated.".FormatWith(CultureInfo.InvariantCulture, contract.UnderlyingType));
|
||||
|
||||
if (contract.DefaultCreator != null &&
|
||||
(!contract.DefaultCreatorNonPublic || Serializer.ConstructorHandling == ConstructorHandling.AllowNonPublicDefaultConstructor))
|
||||
(!contract.DefaultCreatorNonPublic || Serializer._constructorHandling == ConstructorHandling.AllowNonPublicDefaultConstructor))
|
||||
newObject = (IDynamicMetaObjectProvider) contract.DefaultCreator();
|
||||
else
|
||||
throw JsonSerializationException.Create(reader, "Unable to find a default constructor to use for type {0}.".FormatWith(CultureInfo.InvariantCulture, contract.UnderlyingType));
|
||||
@@ -1459,7 +1459,7 @@ To fix this error either change the environment to be fully trusted, change the
|
||||
else if (!property.Writable && value != null)
|
||||
{
|
||||
// handle readonly collection/dictionary properties
|
||||
JsonContract propertyContract = Serializer.ContractResolver.ResolveContract(property.PropertyType);
|
||||
JsonContract propertyContract = Serializer._contractResolver.ResolveContract(property.PropertyType);
|
||||
|
||||
if (propertyContract.ContractType == JsonContractType.Array)
|
||||
{
|
||||
@@ -1565,7 +1565,7 @@ To fix this error either change the environment to be fully trusted, change the
|
||||
if (TraceWriter != null && TraceWriter.LevelFilter >= TraceLevel.Verbose)
|
||||
TraceWriter.Trace(TraceLevel.Verbose, JsonPosition.FormatMessage(reader as IJsonLineInfo, reader.Path, "Could not find member '{0}' on {1}.".FormatWith(CultureInfo.InvariantCulture, memberName, contract.UnderlyingType)), null);
|
||||
|
||||
if (Serializer.MissingMemberHandling == MissingMemberHandling.Error)
|
||||
if (Serializer._missingMemberHandling == MissingMemberHandling.Error)
|
||||
throw JsonSerializationException.Create(reader, "Could not find member '{0}' on object of type '{1}'".FormatWith(CultureInfo.InvariantCulture, memberName, objectType.Name));
|
||||
|
||||
reader.Skip();
|
||||
@@ -1648,7 +1648,7 @@ To fix this error either change the environment to be fully trusted, change the
|
||||
newObject = objectContract.OverrideConstructor.Invoke(null);
|
||||
}
|
||||
else if (objectContract.DefaultCreator != null &&
|
||||
(!objectContract.DefaultCreatorNonPublic || Serializer.ConstructorHandling == ConstructorHandling.AllowNonPublicDefaultConstructor || objectContract.ParametrizedConstructor == null))
|
||||
(!objectContract.DefaultCreatorNonPublic || Serializer._constructorHandling == ConstructorHandling.AllowNonPublicDefaultConstructor || objectContract.ParametrizedConstructor == null))
|
||||
{
|
||||
// use the default constructor if it is...
|
||||
// public
|
||||
@@ -1674,7 +1674,7 @@ To fix this error either change the environment to be fully trusted, change the
|
||||
OnDeserializing(reader, contract, newObject);
|
||||
|
||||
// only need to keep a track of properies presence if they are required or a value should be defaulted if missing
|
||||
Dictionary<JsonProperty, PropertyPresence> propertiesPresence = (contract.HasRequiredOrDefaultValueProperties || HasFlag(Serializer.DefaultValueHandling, DefaultValueHandling.Populate))
|
||||
Dictionary<JsonProperty, PropertyPresence> propertiesPresence = (contract.HasRequiredOrDefaultValueProperties || HasFlag(Serializer._defaultValueHandling, DefaultValueHandling.Populate))
|
||||
? contract.Properties.ToDictionary(m => m, m => PropertyPresence.None)
|
||||
: null;
|
||||
|
||||
@@ -1703,7 +1703,7 @@ To fix this error either change the environment to be fully trusted, change the
|
||||
if (TraceWriter != null && TraceWriter.LevelFilter >= TraceLevel.Verbose)
|
||||
TraceWriter.Trace(TraceLevel.Verbose, JsonPosition.FormatMessage(reader as IJsonLineInfo, reader.Path, "Could not find member '{0}' on {1}".FormatWith(CultureInfo.InvariantCulture, memberName, contract.UnderlyingType)), null);
|
||||
|
||||
if (Serializer.MissingMemberHandling == MissingMemberHandling.Error)
|
||||
if (Serializer._missingMemberHandling == MissingMemberHandling.Error)
|
||||
throw JsonSerializationException.Create(reader, "Could not find member '{0}' on object of type '{1}'".FormatWith(CultureInfo.InvariantCulture, memberName, contract.UnderlyingType.Name));
|
||||
|
||||
reader.Skip();
|
||||
@@ -1775,7 +1775,7 @@ To fix this error either change the environment to be fully trusted, change the
|
||||
if (property.PropertyContract == null)
|
||||
property.PropertyContract = GetContractSafe(property.PropertyType);
|
||||
|
||||
if (HasFlag(property.DefaultValueHandling.GetValueOrDefault(Serializer.DefaultValueHandling), DefaultValueHandling.Populate) && property.Writable)
|
||||
if (HasFlag(property.DefaultValueHandling.GetValueOrDefault(Serializer._defaultValueHandling), DefaultValueHandling.Populate) && property.Writable)
|
||||
property.ValueProvider.SetValue(newObject, EnsureType(reader, property.GetResolvedDefaultValue(), CultureInfo.InvariantCulture, property.PropertyContract, property.PropertyType));
|
||||
break;
|
||||
case PropertyPresence.Null:
|
||||
|
||||
@@ -62,7 +62,7 @@ namespace Newtonsoft.Json.Serialization
|
||||
throw new ArgumentNullException("jsonWriter");
|
||||
|
||||
if (objectType != null)
|
||||
_rootContract = Serializer.ContractResolver.ResolveContract(objectType);
|
||||
_rootContract = Serializer._contractResolver.ResolveContract(objectType);
|
||||
|
||||
SerializeValue(jsonWriter, value, GetContractSafe(value), null, null, null);
|
||||
}
|
||||
@@ -80,7 +80,7 @@ namespace Newtonsoft.Json.Serialization
|
||||
if (value == null)
|
||||
return null;
|
||||
|
||||
return Serializer.ContractResolver.ResolveContract(value.GetType());
|
||||
return Serializer._contractResolver.ResolveContract(value.GetType());
|
||||
}
|
||||
|
||||
private void SerializePrimitive(JsonWriter writer, object value, JsonPrimitiveContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerProperty)
|
||||
@@ -159,7 +159,7 @@ namespace Newtonsoft.Json.Serialization
|
||||
break;
|
||||
#endif
|
||||
case JsonContractType.Linq:
|
||||
((JToken) value).WriteTo(writer, (Serializer.Converters != null) ? Serializer.Converters.ToArray() : null);
|
||||
((JToken) value).WriteTo(writer, Serializer.Converters.ToArray());
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -196,24 +196,24 @@ namespace Newtonsoft.Json.Serialization
|
||||
if (isReference == null)
|
||||
{
|
||||
if (valueContract.ContractType == JsonContractType.Array)
|
||||
isReference = HasFlag(Serializer.PreserveReferencesHandling, PreserveReferencesHandling.Arrays);
|
||||
isReference = HasFlag(Serializer._preserveReferencesHandling, PreserveReferencesHandling.Arrays);
|
||||
else
|
||||
isReference = HasFlag(Serializer.PreserveReferencesHandling, PreserveReferencesHandling.Objects);
|
||||
isReference = HasFlag(Serializer._preserveReferencesHandling, PreserveReferencesHandling.Objects);
|
||||
}
|
||||
|
||||
if (!isReference.Value)
|
||||
return false;
|
||||
|
||||
return Serializer.ReferenceResolver.IsReferenced(this, value);
|
||||
return Serializer.GetReferenceResolver().IsReferenced(this, value);
|
||||
}
|
||||
|
||||
private bool ShouldWriteProperty(object memberValue, JsonProperty property)
|
||||
{
|
||||
if (property.NullValueHandling.GetValueOrDefault(Serializer.NullValueHandling) == NullValueHandling.Ignore &&
|
||||
if (property.NullValueHandling.GetValueOrDefault(Serializer._nullValueHandling) == NullValueHandling.Ignore &&
|
||||
memberValue == null)
|
||||
return false;
|
||||
|
||||
if (HasFlag(property.DefaultValueHandling.GetValueOrDefault(Serializer.DefaultValueHandling), DefaultValueHandling.Ignore)
|
||||
if (HasFlag(property.DefaultValueHandling.GetValueOrDefault(Serializer._defaultValueHandling), DefaultValueHandling.Ignore)
|
||||
&& MiscellaneousUtils.ValueEquals(memberValue, property.GetResolvedDefaultValue()))
|
||||
return false;
|
||||
|
||||
@@ -243,7 +243,7 @@ namespace Newtonsoft.Json.Serialization
|
||||
message += " for property '{0}'".FormatWith(CultureInfo.InvariantCulture, property.PropertyName);
|
||||
message += " with type '{0}'.".FormatWith(CultureInfo.InvariantCulture, value.GetType());
|
||||
|
||||
switch (referenceLoopHandling.GetValueOrDefault(Serializer.ReferenceLoopHandling))
|
||||
switch (referenceLoopHandling.GetValueOrDefault(Serializer._referenceLoopHandling))
|
||||
{
|
||||
case ReferenceLoopHandling.Error:
|
||||
throw JsonSerializationException.Create(null, writer.ContainerPath, message, null);
|
||||
@@ -280,7 +280,7 @@ namespace Newtonsoft.Json.Serialization
|
||||
{
|
||||
try
|
||||
{
|
||||
string reference = Serializer.ReferenceResolver.GetReference(this, value);
|
||||
string reference = Serializer.GetReferenceResolver().GetReference(this, value);
|
||||
|
||||
return reference;
|
||||
}
|
||||
@@ -349,7 +349,7 @@ namespace Newtonsoft.Json.Serialization
|
||||
if (TraceWriter != null && TraceWriter.LevelFilter >= TraceLevel.Info)
|
||||
TraceWriter.Trace(TraceLevel.Info, JsonPosition.FormatMessage(null, writer.Path, "Started serializing {0}".FormatWith(CultureInfo.InvariantCulture, contract.UnderlyingType)), null);
|
||||
|
||||
contract.InvokeOnSerializing(value, Serializer.Context);
|
||||
contract.InvokeOnSerializing(value, Serializer._context);
|
||||
}
|
||||
|
||||
private void OnSerialized(JsonWriter writer, JsonContract contract, object value)
|
||||
@@ -357,7 +357,7 @@ namespace Newtonsoft.Json.Serialization
|
||||
if (TraceWriter != null && TraceWriter.LevelFilter >= TraceLevel.Info)
|
||||
TraceWriter.Trace(TraceLevel.Info, JsonPosition.FormatMessage(null, writer.Path, "Finished serializing {0}".FormatWith(CultureInfo.InvariantCulture, contract.UnderlyingType)), null);
|
||||
|
||||
contract.InvokeOnSerialized(value, Serializer.Context);
|
||||
contract.InvokeOnSerialized(value, Serializer._context);
|
||||
}
|
||||
|
||||
private void SerializeObject(JsonWriter writer, object value, JsonObjectContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty)
|
||||
@@ -405,7 +405,7 @@ namespace Newtonsoft.Json.Serialization
|
||||
if (!property.Ignored && property.Readable && ShouldSerialize(writer, property, value) && IsSpecified(writer, property, value))
|
||||
{
|
||||
if (property.PropertyContract == null)
|
||||
property.PropertyContract = Serializer.ContractResolver.ResolveContract(property.PropertyType);
|
||||
property.PropertyContract = Serializer._contractResolver.ResolveContract(property.PropertyType);
|
||||
|
||||
memberValue = property.ValueProvider.GetValue(value);
|
||||
memberContract = (property.PropertyContract.IsSealed) ? property.PropertyContract : GetContractSafe(memberValue);
|
||||
@@ -443,7 +443,7 @@ namespace Newtonsoft.Json.Serialization
|
||||
{
|
||||
writer.WriteStartObject();
|
||||
|
||||
bool isReference = ResolveIsReference(contract, member, collectionContract, containerProperty) ?? HasFlag(Serializer.PreserveReferencesHandling, PreserveReferencesHandling.Objects);
|
||||
bool isReference = ResolveIsReference(contract, member, collectionContract, containerProperty) ?? HasFlag(Serializer._preserveReferencesHandling, PreserveReferencesHandling.Objects);
|
||||
if (isReference)
|
||||
{
|
||||
WriteReferenceIdProperty(writer, contract.UnderlyingType, value);
|
||||
@@ -467,7 +467,7 @@ namespace Newtonsoft.Json.Serialization
|
||||
|
||||
private void WriteTypeProperty(JsonWriter writer, Type type)
|
||||
{
|
||||
string typeName = ReflectionUtils.GetTypeName(type, Serializer.TypeNameAssemblyFormat, Serializer.Binder);
|
||||
string typeName = ReflectionUtils.GetTypeName(type, Serializer._typeNameAssemblyFormat, Serializer._binder);
|
||||
|
||||
if (TraceWriter != null && TraceWriter.LevelFilter >= TraceLevel.Verbose)
|
||||
TraceWriter.Trace(TraceLevel.Verbose, JsonPosition.FormatMessage(null, writer.Path, "Writing type name '{0}' for {1}.".FormatWith(CultureInfo.InvariantCulture, typeName, type)), null);
|
||||
@@ -647,7 +647,7 @@ namespace Newtonsoft.Json.Serialization
|
||||
|
||||
private bool WriteStartArray(JsonWriter writer, object values, JsonArrayContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerProperty)
|
||||
{
|
||||
bool isReference = ResolveIsReference(contract, member, containerContract, containerProperty) ?? HasFlag(Serializer.PreserveReferencesHandling, PreserveReferencesHandling.Arrays);
|
||||
bool isReference = ResolveIsReference(contract, member, containerContract, containerProperty) ?? HasFlag(Serializer._preserveReferencesHandling, PreserveReferencesHandling.Arrays);
|
||||
bool includeTypeDetails = ShouldWriteType(TypeNameHandling.Arrays, contract, member, containerContract, containerProperty);
|
||||
bool writeMetadataObject = isReference || includeTypeDetails;
|
||||
|
||||
@@ -667,7 +667,7 @@ namespace Newtonsoft.Json.Serialization
|
||||
}
|
||||
|
||||
if (contract.ItemContract == null)
|
||||
contract.ItemContract = Serializer.ContractResolver.ResolveContract(contract.CollectionItemType ?? typeof (object));
|
||||
contract.ItemContract = Serializer._contractResolver.ResolveContract(contract.CollectionItemType ?? typeof (object));
|
||||
|
||||
return writeMetadataObject;
|
||||
}
|
||||
@@ -690,7 +690,7 @@ To fix this error either change the environment to be fully trusted, change the
|
||||
WriteObjectStart(writer, value, contract, member, collectionContract, containerProperty);
|
||||
|
||||
SerializationInfo serializationInfo = new SerializationInfo(contract.UnderlyingType, new FormatterConverter());
|
||||
value.GetObjectData(serializationInfo, Serializer.Context);
|
||||
value.GetObjectData(serializationInfo, Serializer._context);
|
||||
|
||||
foreach (SerializationEntry serializationEntry in serializationInfo)
|
||||
{
|
||||
@@ -790,7 +790,7 @@ To fix this error either change the environment to be fully trusted, change the
|
||||
((member != null) ? member.TypeNameHandling : null)
|
||||
?? ((containerProperty != null) ? containerProperty.ItemTypeNameHandling : null)
|
||||
?? ((containerContract != null) ? containerContract.ItemTypeNameHandling : null)
|
||||
?? Serializer.TypeNameHandling;
|
||||
?? Serializer._typeNameHandling;
|
||||
|
||||
if (HasFlag(resolvedTypeNameHandling, typeNameHandlingFlag))
|
||||
return true;
|
||||
@@ -829,10 +829,10 @@ To fix this error either change the environment to be fully trusted, change the
|
||||
WriteObjectStart(writer, underlyingDictionary, contract, member, collectionContract, containerProperty);
|
||||
|
||||
if (contract.ItemContract == null)
|
||||
contract.ItemContract = Serializer.ContractResolver.ResolveContract(contract.DictionaryValueType ?? typeof(object));
|
||||
contract.ItemContract = Serializer._contractResolver.ResolveContract(contract.DictionaryValueType ?? typeof(object));
|
||||
|
||||
if (contract.KeyContract == null)
|
||||
contract.KeyContract = Serializer.ContractResolver.ResolveContract(contract.DictionaryKeyType ?? typeof(object));
|
||||
contract.KeyContract = Serializer._contractResolver.ResolveContract(contract.DictionaryKeyType ?? typeof(object));
|
||||
|
||||
int initialDepth = writer.Top;
|
||||
|
||||
@@ -894,7 +894,7 @@ To fix this error either change the environment to be fully trusted, change the
|
||||
{
|
||||
escape = false;
|
||||
StringWriter sw = new StringWriter(CultureInfo.InvariantCulture);
|
||||
JsonConvert.WriteDateTimeString(sw, (DateTime)key, writer.DateFormatHandling, writer.DateFormatString, writer.Culture);
|
||||
DateTimeUtils.WriteDateTimeString(sw, (DateTime)key, writer.DateFormatHandling, writer.DateFormatString, writer.Culture);
|
||||
return sw.ToString();
|
||||
}
|
||||
#if !NET20
|
||||
@@ -902,7 +902,7 @@ To fix this error either change the environment to be fully trusted, change the
|
||||
{
|
||||
escape = false;
|
||||
StringWriter sw = new StringWriter(CultureInfo.InvariantCulture);
|
||||
JsonConvert.WriteDateTimeOffsetString(sw, (DateTimeOffset)key, writer.DateFormatHandling, writer.DateFormatString, writer.Culture);
|
||||
DateTimeUtils.WriteDateTimeOffsetString(sw, (DateTimeOffset)key, writer.DateFormatHandling, writer.DateFormatString, writer.Culture);
|
||||
return sw.ToString();
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -0,0 +1,248 @@
|
||||
#region License
|
||||
// Copyright (c) 2007 James Newton-King
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person
|
||||
// obtaining a copy of this software and associated documentation
|
||||
// files (the "Software"), to deal in the Software without
|
||||
// restriction, including without limitation the rights to use,
|
||||
// copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
// copies of the Software, and to permit persons to whom the
|
||||
// Software is furnished to do so, subject to the following
|
||||
// conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||
// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||
// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
// OTHER DEALINGS IN THE SOFTWARE.
|
||||
#endregion
|
||||
|
||||
using System;
|
||||
|
||||
namespace Newtonsoft.Json.Utilities
|
||||
{
|
||||
internal enum ParserTimeZone
|
||||
{
|
||||
Unspecified,
|
||||
Utc,
|
||||
LocalWestOfUtc,
|
||||
LocalEastOfUtc
|
||||
}
|
||||
|
||||
internal struct DateTimeParser
|
||||
{
|
||||
static DateTimeParser()
|
||||
{
|
||||
Power10 = new[] { -1, 10, 100, 1000, 10000, 100000, 1000000 };
|
||||
|
||||
Lzyyyy = "yyyy".Length;
|
||||
Lzyyyy_ = "yyyy-".Length;
|
||||
Lzyyyy_MM = "yyyy-MM".Length;
|
||||
Lzyyyy_MM_ = "yyyy-MM-".Length;
|
||||
Lzyyyy_MM_dd = "yyyy-MM-dd".Length;
|
||||
Lzyyyy_MM_ddT = "yyyy-MM-ddT".Length;
|
||||
LzHH = "HH".Length;
|
||||
LzHH_ = "HH:".Length;
|
||||
LzHH_mm = "HH:mm".Length;
|
||||
LzHH_mm_ = "HH:mm:".Length;
|
||||
LzHH_mm_ss = "HH:mm:ss".Length;
|
||||
Lz_ = "-".Length;
|
||||
Lz_zz = "-zz".Length;
|
||||
Lz_zz_ = "-zz:".Length;
|
||||
Lz_zz_zz = "-zz:zz".Length;
|
||||
}
|
||||
|
||||
public int Year;
|
||||
public int Month;
|
||||
public int Day;
|
||||
public int Hour;
|
||||
public int Minute;
|
||||
public int Second;
|
||||
public int Fraction;
|
||||
public int ZoneHour;
|
||||
public int ZoneMinute;
|
||||
public ParserTimeZone Zone;
|
||||
|
||||
private string _text;
|
||||
private int _length;
|
||||
|
||||
private static readonly int[] Power10;
|
||||
|
||||
private static readonly int Lzyyyy;
|
||||
private static readonly int Lzyyyy_;
|
||||
private static readonly int Lzyyyy_MM;
|
||||
private static readonly int Lzyyyy_MM_;
|
||||
private static readonly int Lzyyyy_MM_dd;
|
||||
private static readonly int Lzyyyy_MM_ddT;
|
||||
private static readonly int LzHH;
|
||||
private static readonly int LzHH_;
|
||||
private static readonly int LzHH_mm;
|
||||
private static readonly int LzHH_mm_;
|
||||
private static readonly int LzHH_mm_ss;
|
||||
private static readonly int Lz_;
|
||||
private static readonly int Lz_zz;
|
||||
private static readonly int Lz_zz_;
|
||||
private static readonly int Lz_zz_zz;
|
||||
|
||||
private const short MaxFractionDigits = 7;
|
||||
|
||||
public bool Parse(string text)
|
||||
{
|
||||
_text = text;
|
||||
_length = text.Length;
|
||||
|
||||
if (ParseDate(0) && ParseChar(Lzyyyy_MM_dd, 'T') && ParseTimeAndZoneAndWhitespace(Lzyyyy_MM_ddT))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
private bool ParseDate(int start)
|
||||
{
|
||||
return (Parse4Digit(start, out Year)
|
||||
&& 1 <= Year
|
||||
&& ParseChar(start + Lzyyyy, '-')
|
||||
&& Parse2Digit(start + Lzyyyy_, out Month)
|
||||
&& 1 <= Month
|
||||
&& Month <= 12
|
||||
&& ParseChar(start + Lzyyyy_MM, '-')
|
||||
&& Parse2Digit(start + Lzyyyy_MM_, out Day)
|
||||
&& 1 <= Day
|
||||
&& Day <= DateTime.DaysInMonth(Year, Month));
|
||||
}
|
||||
|
||||
private bool ParseTimeAndZoneAndWhitespace(int start)
|
||||
{
|
||||
return (ParseTime(ref start) && ParseZone(start));
|
||||
}
|
||||
|
||||
private bool ParseTime(ref int start)
|
||||
{
|
||||
if (!(Parse2Digit(start, out Hour)
|
||||
&& Hour < 24
|
||||
&& ParseChar(start + LzHH, ':')
|
||||
&& Parse2Digit(start + LzHH_, out Minute)
|
||||
&& Minute < 60
|
||||
&& ParseChar(start + LzHH_mm, ':')
|
||||
&& Parse2Digit(start + LzHH_mm_, out Second)
|
||||
&& Second < 60))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
start += LzHH_mm_ss;
|
||||
if (ParseChar(start, '.'))
|
||||
{
|
||||
Fraction = 0;
|
||||
int numberOfDigits = 0;
|
||||
|
||||
while (++start < _length && numberOfDigits < MaxFractionDigits)
|
||||
{
|
||||
int digit = _text[start] - '0';
|
||||
if (digit < 0 || digit > 9)
|
||||
break;
|
||||
|
||||
Fraction = (Fraction*10) + digit;
|
||||
|
||||
numberOfDigits++;
|
||||
}
|
||||
|
||||
if (numberOfDigits < MaxFractionDigits)
|
||||
{
|
||||
if (numberOfDigits == 0)
|
||||
return false;
|
||||
|
||||
Fraction *= Power10[MaxFractionDigits - numberOfDigits];
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private bool ParseZone(int start)
|
||||
{
|
||||
if (start < _length)
|
||||
{
|
||||
char ch = _text[start];
|
||||
if (ch == 'Z' || ch == 'z')
|
||||
{
|
||||
Zone = ParserTimeZone.Utc;
|
||||
start++;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (start + 5 < _length
|
||||
&& Parse2Digit(start + Lz_, out ZoneHour)
|
||||
&& ZoneHour <= 99
|
||||
&& ParseChar(start + Lz_zz, ':')
|
||||
&& Parse2Digit(start + Lz_zz_, out ZoneMinute)
|
||||
&& ZoneMinute <= 99)
|
||||
{
|
||||
switch (ch)
|
||||
{
|
||||
case '-':
|
||||
Zone = ParserTimeZone.LocalWestOfUtc;
|
||||
start += Lz_zz_zz;
|
||||
break;
|
||||
|
||||
case '+':
|
||||
Zone = ParserTimeZone.LocalEastOfUtc;
|
||||
start += Lz_zz_zz;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return (start == _length);
|
||||
}
|
||||
|
||||
private bool Parse4Digit(int start, out int num)
|
||||
{
|
||||
if (start + 3 < _length)
|
||||
{
|
||||
int digit1 = _text[start] - '0';
|
||||
int digit2 = _text[start + 1] - '0';
|
||||
int digit3 = _text[start + 2] - '0';
|
||||
int digit4 = _text[start + 3] - '0';
|
||||
if (0 <= digit1 && digit1 < 10
|
||||
&& 0 <= digit2 && digit2 < 10
|
||||
&& 0 <= digit3 && digit3 < 10
|
||||
&& 0 <= digit4 && digit4 < 10)
|
||||
{
|
||||
num = (((((digit1*10) + digit2)*10) + digit3)*10) + digit4;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
num = 0;
|
||||
return false;
|
||||
}
|
||||
|
||||
private bool Parse2Digit(int start, out int num)
|
||||
{
|
||||
if (start + 1 < _length)
|
||||
{
|
||||
int digit1 = _text[start] - '0';
|
||||
int digit2 = _text[start + 1] - '0';
|
||||
if (0 <= digit1 && digit1 < 10
|
||||
&& 0 <= digit2 && digit2 < 10)
|
||||
{
|
||||
num = (digit1*10) + digit2;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
num = 0;
|
||||
return false;
|
||||
}
|
||||
|
||||
private bool ParseChar(int start, char ch)
|
||||
{
|
||||
return (start < _length && _text[start] == ch);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,5 @@
|
||||
#region License
|
||||
|
||||
// Copyright (c) 2007 James Newton-King
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person
|
||||
@@ -21,9 +22,11 @@
|
||||
// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
// OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
#endregion
|
||||
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Xml;
|
||||
using System.Globalization;
|
||||
|
||||
@@ -31,6 +34,22 @@ namespace Newtonsoft.Json.Utilities
|
||||
{
|
||||
internal static class DateTimeUtils
|
||||
{
|
||||
internal static readonly long InitialJavaScriptDateTicks = 621355968000000000;
|
||||
|
||||
private const int DaysPer100Years = 36524;
|
||||
private const int DaysPer400Years = 146097;
|
||||
private const int DaysPer4Years = 1461;
|
||||
private const int DaysPerYear = 365;
|
||||
private const long TicksPerDay = 864000000000L;
|
||||
private static readonly int[] DaysToMonth365;
|
||||
private static readonly int[] DaysToMonth366;
|
||||
|
||||
static DateTimeUtils()
|
||||
{
|
||||
DaysToMonth365 = new[] { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 };
|
||||
DaysToMonth366 = new[] { 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366 };
|
||||
}
|
||||
|
||||
public static TimeSpan GetUtcOffset(this DateTime d)
|
||||
{
|
||||
#if NET20
|
||||
@@ -56,5 +75,506 @@ namespace Newtonsoft.Json.Utilities
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
internal static DateTime EnsureDateTime(DateTime value, DateTimeZoneHandling timeZone)
|
||||
{
|
||||
switch (timeZone)
|
||||
{
|
||||
case DateTimeZoneHandling.Local:
|
||||
value = SwitchToLocalTime(value);
|
||||
break;
|
||||
case DateTimeZoneHandling.Utc:
|
||||
value = SwitchToUtcTime(value);
|
||||
break;
|
||||
case DateTimeZoneHandling.Unspecified:
|
||||
value = new DateTime(value.Ticks, DateTimeKind.Unspecified);
|
||||
break;
|
||||
case DateTimeZoneHandling.RoundtripKind:
|
||||
break;
|
||||
default:
|
||||
throw new ArgumentException("Invalid date time handling value.");
|
||||
}
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
private static DateTime SwitchToLocalTime(DateTime value)
|
||||
{
|
||||
switch (value.Kind)
|
||||
{
|
||||
case DateTimeKind.Unspecified:
|
||||
return new DateTime(value.Ticks, DateTimeKind.Local);
|
||||
|
||||
case DateTimeKind.Utc:
|
||||
return value.ToLocalTime();
|
||||
|
||||
case DateTimeKind.Local:
|
||||
return value;
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
||||
private static DateTime SwitchToUtcTime(DateTime value)
|
||||
{
|
||||
switch (value.Kind)
|
||||
{
|
||||
case DateTimeKind.Unspecified:
|
||||
return new DateTime(value.Ticks, DateTimeKind.Utc);
|
||||
|
||||
case DateTimeKind.Utc:
|
||||
return value;
|
||||
|
||||
case DateTimeKind.Local:
|
||||
return value.ToUniversalTime();
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
||||
private static long ToUniversalTicks(DateTime dateTime)
|
||||
{
|
||||
if (dateTime.Kind == DateTimeKind.Utc)
|
||||
return dateTime.Ticks;
|
||||
|
||||
return ToUniversalTicks(dateTime, dateTime.GetUtcOffset());
|
||||
}
|
||||
|
||||
private static long ToUniversalTicks(DateTime dateTime, TimeSpan offset)
|
||||
{
|
||||
// special case min and max value
|
||||
// they never have a timezone appended to avoid issues
|
||||
if (dateTime.Kind == DateTimeKind.Utc || dateTime == DateTime.MaxValue || dateTime == DateTime.MinValue)
|
||||
return dateTime.Ticks;
|
||||
|
||||
long ticks = dateTime.Ticks - offset.Ticks;
|
||||
if (ticks > 3155378975999999999L)
|
||||
return 3155378975999999999L;
|
||||
|
||||
if (ticks < 0L)
|
||||
return 0L;
|
||||
|
||||
return ticks;
|
||||
}
|
||||
|
||||
internal static long ConvertDateTimeToJavaScriptTicks(DateTime dateTime, TimeSpan offset)
|
||||
{
|
||||
long universialTicks = ToUniversalTicks(dateTime, offset);
|
||||
|
||||
return UniversialTicksToJavaScriptTicks(universialTicks);
|
||||
}
|
||||
|
||||
internal static long ConvertDateTimeToJavaScriptTicks(DateTime dateTime)
|
||||
{
|
||||
return ConvertDateTimeToJavaScriptTicks(dateTime, true);
|
||||
}
|
||||
|
||||
internal static long ConvertDateTimeToJavaScriptTicks(DateTime dateTime, bool convertToUtc)
|
||||
{
|
||||
long ticks = (convertToUtc) ? ToUniversalTicks(dateTime) : dateTime.Ticks;
|
||||
|
||||
return UniversialTicksToJavaScriptTicks(ticks);
|
||||
}
|
||||
|
||||
private static long UniversialTicksToJavaScriptTicks(long universialTicks)
|
||||
{
|
||||
long javaScriptTicks = (universialTicks - InitialJavaScriptDateTicks)/10000;
|
||||
|
||||
return javaScriptTicks;
|
||||
}
|
||||
|
||||
internal static DateTime ConvertJavaScriptTicksToDateTime(long javaScriptTicks)
|
||||
{
|
||||
DateTime dateTime = new DateTime((javaScriptTicks*10000) + InitialJavaScriptDateTicks, DateTimeKind.Utc);
|
||||
|
||||
return dateTime;
|
||||
}
|
||||
|
||||
#region Parse
|
||||
|
||||
internal static bool TryParseDateIso(string text, DateParseHandling dateParseHandling, DateTimeZoneHandling dateTimeZoneHandling, out object dt)
|
||||
{
|
||||
DateTimeParser dateTimeParser = new DateTimeParser();
|
||||
if (!dateTimeParser.Parse(text))
|
||||
{
|
||||
dt = null;
|
||||
return false;
|
||||
}
|
||||
|
||||
DateTime d = new DateTime(dateTimeParser.Year, dateTimeParser.Month, dateTimeParser.Day, dateTimeParser.Hour, dateTimeParser.Minute, dateTimeParser.Second);
|
||||
d = d.AddTicks(dateTimeParser.Fraction);
|
||||
|
||||
#if !NET20
|
||||
if (dateParseHandling == DateParseHandling.DateTimeOffset)
|
||||
{
|
||||
TimeSpan offset;
|
||||
|
||||
switch (dateTimeParser.Zone)
|
||||
{
|
||||
case ParserTimeZone.Utc:
|
||||
offset = new TimeSpan(0L);
|
||||
break;
|
||||
case ParserTimeZone.LocalWestOfUtc:
|
||||
offset = new TimeSpan(-dateTimeParser.ZoneHour, -dateTimeParser.ZoneMinute, 0);
|
||||
break;
|
||||
case ParserTimeZone.LocalEastOfUtc:
|
||||
offset = new TimeSpan(dateTimeParser.ZoneHour, dateTimeParser.ZoneMinute, 0);
|
||||
break;
|
||||
default:
|
||||
offset = TimeZoneInfo.Local.GetUtcOffset(d);
|
||||
break;
|
||||
}
|
||||
|
||||
long ticks = d.Ticks - offset.Ticks;
|
||||
if (ticks < 0 || ticks > 3155378975999999999)
|
||||
{
|
||||
dt = null;
|
||||
return false;
|
||||
}
|
||||
|
||||
dt = new DateTimeOffset(d, offset);
|
||||
return true;
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
long ticks;
|
||||
|
||||
switch (dateTimeParser.Zone)
|
||||
{
|
||||
case ParserTimeZone.Utc:
|
||||
d = new DateTime(d.Ticks, DateTimeKind.Utc);
|
||||
break;
|
||||
|
||||
case ParserTimeZone.LocalWestOfUtc:
|
||||
{
|
||||
TimeSpan offset = new TimeSpan(dateTimeParser.ZoneHour, dateTimeParser.ZoneMinute, 0);
|
||||
ticks = d.Ticks + offset.Ticks;
|
||||
if (ticks <= DateTime.MaxValue.Ticks)
|
||||
{
|
||||
d = new DateTime(ticks, DateTimeKind.Utc).ToLocalTime();
|
||||
}
|
||||
else
|
||||
{
|
||||
ticks += d.GetUtcOffset().Ticks;
|
||||
if (ticks > DateTime.MaxValue.Ticks)
|
||||
ticks = DateTime.MaxValue.Ticks;
|
||||
|
||||
d = new DateTime(ticks, DateTimeKind.Local);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case ParserTimeZone.LocalEastOfUtc:
|
||||
{
|
||||
TimeSpan offset = new TimeSpan(dateTimeParser.ZoneHour, dateTimeParser.ZoneMinute, 0);
|
||||
ticks = d.Ticks - offset.Ticks;
|
||||
if (ticks >= DateTime.MinValue.Ticks)
|
||||
{
|
||||
d = new DateTime(ticks, DateTimeKind.Utc).ToLocalTime();
|
||||
}
|
||||
else
|
||||
{
|
||||
ticks += d.GetUtcOffset().Ticks;
|
||||
if (ticks < DateTime.MinValue.Ticks)
|
||||
ticks = DateTime.MinValue.Ticks;
|
||||
|
||||
d = new DateTime(ticks, DateTimeKind.Local);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
dt = EnsureDateTime(d, dateTimeZoneHandling);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
internal static bool TryParseDateTime(string s, DateParseHandling dateParseHandling, DateTimeZoneHandling dateTimeZoneHandling, out object dt)
|
||||
{
|
||||
if (s.Length > 0)
|
||||
{
|
||||
if (s[0] == '/')
|
||||
{
|
||||
if (s.StartsWith("/Date(", StringComparison.Ordinal) && s.EndsWith(")/", StringComparison.Ordinal))
|
||||
{
|
||||
return TryParseDateMicrosoft(s, dateParseHandling, dateTimeZoneHandling, out dt);
|
||||
}
|
||||
}
|
||||
else if (s.Length >= 19 && s.Length <= 40 && char.IsDigit(s[0]) && s[10] == 'T')
|
||||
{
|
||||
return TryParseDateIso(s, dateParseHandling, dateTimeZoneHandling, out dt);
|
||||
}
|
||||
}
|
||||
|
||||
dt = null;
|
||||
return false;
|
||||
}
|
||||
|
||||
private static bool TryParseDateMicrosoft(string text, DateParseHandling dateParseHandling, DateTimeZoneHandling dateTimeZoneHandling, out object dt)
|
||||
{
|
||||
string value = text.Substring(6, text.Length - 8);
|
||||
DateTimeKind kind = DateTimeKind.Utc;
|
||||
|
||||
int index = value.IndexOf('+', 1);
|
||||
|
||||
if (index == -1)
|
||||
index = value.IndexOf('-', 1);
|
||||
|
||||
TimeSpan offset = TimeSpan.Zero;
|
||||
|
||||
if (index != -1)
|
||||
{
|
||||
kind = DateTimeKind.Local;
|
||||
offset = ReadOffset(value.Substring(index));
|
||||
value = value.Substring(0, index);
|
||||
}
|
||||
|
||||
long javaScriptTicks = long.Parse(value, NumberStyles.Integer, CultureInfo.InvariantCulture);
|
||||
|
||||
DateTime utcDateTime = ConvertJavaScriptTicksToDateTime(javaScriptTicks);
|
||||
|
||||
#if !NET20
|
||||
if (dateParseHandling == DateParseHandling.DateTimeOffset)
|
||||
{
|
||||
dt = new DateTimeOffset(utcDateTime.Add(offset).Ticks, offset);
|
||||
return true;
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
DateTime dateTime;
|
||||
|
||||
switch (kind)
|
||||
{
|
||||
case DateTimeKind.Unspecified:
|
||||
dateTime = DateTime.SpecifyKind(utcDateTime.ToLocalTime(), DateTimeKind.Unspecified);
|
||||
break;
|
||||
case DateTimeKind.Local:
|
||||
dateTime = utcDateTime.ToLocalTime();
|
||||
break;
|
||||
default:
|
||||
dateTime = utcDateTime;
|
||||
break;
|
||||
}
|
||||
|
||||
dt = EnsureDateTime(dateTime, dateTimeZoneHandling);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
private static TimeSpan ReadOffset(string offsetText)
|
||||
{
|
||||
bool negative = (offsetText[0] == '-');
|
||||
|
||||
int hours = int.Parse(offsetText.Substring(1, 2), NumberStyles.Integer, CultureInfo.InvariantCulture);
|
||||
int minutes = 0;
|
||||
if (offsetText.Length >= 5)
|
||||
minutes = int.Parse(offsetText.Substring(3, 2), NumberStyles.Integer, CultureInfo.InvariantCulture);
|
||||
|
||||
TimeSpan offset = TimeSpan.FromHours(hours) + TimeSpan.FromMinutes(minutes);
|
||||
if (negative)
|
||||
offset = offset.Negate();
|
||||
|
||||
return offset;
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Write
|
||||
internal static void WriteDateTimeString(TextWriter writer, DateTime value, DateFormatHandling format, string formatString, CultureInfo culture)
|
||||
{
|
||||
if (string.IsNullOrEmpty(formatString))
|
||||
{
|
||||
char[] chars = new char[64];
|
||||
int pos = WriteDateTimeString(chars, 0, value, null, value.Kind, format);
|
||||
writer.Write(chars, 0, pos);
|
||||
}
|
||||
else
|
||||
{
|
||||
writer.Write(value.ToString(formatString, culture));
|
||||
}
|
||||
}
|
||||
|
||||
internal static int WriteDateTimeString(char[] chars, int start, DateTime value, TimeSpan? offset, DateTimeKind kind, DateFormatHandling format)
|
||||
{
|
||||
int pos = start;
|
||||
|
||||
if (format == DateFormatHandling.MicrosoftDateFormat)
|
||||
{
|
||||
TimeSpan o = offset ?? value.GetUtcOffset();
|
||||
|
||||
long javaScriptTicks = ConvertDateTimeToJavaScriptTicks(value, o);
|
||||
|
||||
@"\/Date(".CopyTo(0, chars, pos, 7);
|
||||
pos += 7;
|
||||
|
||||
string ticksText = javaScriptTicks.ToString(CultureInfo.InvariantCulture);
|
||||
ticksText.CopyTo(0, chars, pos, ticksText.Length);
|
||||
pos += ticksText.Length;
|
||||
|
||||
switch (kind)
|
||||
{
|
||||
case DateTimeKind.Unspecified:
|
||||
if (value != DateTime.MaxValue && value != DateTime.MinValue)
|
||||
pos = WriteDateTimeOffset(chars, pos, o, format);
|
||||
break;
|
||||
case DateTimeKind.Local:
|
||||
pos = WriteDateTimeOffset(chars, pos, o, format);
|
||||
break;
|
||||
}
|
||||
|
||||
@")\/".CopyTo(0, chars, pos, 3);
|
||||
pos += 3;
|
||||
}
|
||||
else
|
||||
{
|
||||
pos = WriteDefaultIsoDate(chars, pos, value);
|
||||
|
||||
switch (kind)
|
||||
{
|
||||
case DateTimeKind.Local:
|
||||
pos = WriteDateTimeOffset(chars, pos, offset ?? value.GetUtcOffset(), format);
|
||||
break;
|
||||
case DateTimeKind.Utc:
|
||||
chars[pos++] = 'Z';
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return pos;
|
||||
}
|
||||
|
||||
internal static int WriteDefaultIsoDate(char[] chars, int start, DateTime dt)
|
||||
{
|
||||
int length = 19;
|
||||
|
||||
int year;
|
||||
int month;
|
||||
int day;
|
||||
GetDateValues(dt, out year, out month, out day);
|
||||
|
||||
CopyIntToCharArray(chars, start, year, 4);
|
||||
chars[start + 4] = '-';
|
||||
CopyIntToCharArray(chars, start + 5, month, 2);
|
||||
chars[start + 7] = '-';
|
||||
CopyIntToCharArray(chars, start + 8, day, 2);
|
||||
chars[start + 10] = 'T';
|
||||
CopyIntToCharArray(chars, start + 11, dt.Hour, 2);
|
||||
chars[start + 13] = ':';
|
||||
CopyIntToCharArray(chars, start + 14, dt.Minute, 2);
|
||||
chars[start + 16] = ':';
|
||||
CopyIntToCharArray(chars, start + 17, dt.Second, 2);
|
||||
|
||||
int fraction = (int)(dt.Ticks % 10000000L);
|
||||
|
||||
if (fraction != 0)
|
||||
{
|
||||
int digits = 7;
|
||||
while ((fraction%10) == 0)
|
||||
{
|
||||
digits--;
|
||||
fraction /= 10;
|
||||
}
|
||||
|
||||
chars[start + 19] = '.';
|
||||
CopyIntToCharArray(chars, start + 20, fraction, digits);
|
||||
|
||||
length += digits + 1;
|
||||
}
|
||||
|
||||
return start + length;
|
||||
}
|
||||
|
||||
private static void CopyIntToCharArray(char[] chars, int start, int value, int digits)
|
||||
{
|
||||
while (digits-- != 0)
|
||||
{
|
||||
chars[start + digits] = (char) ((value%10) + 48);
|
||||
value /= 10;
|
||||
}
|
||||
}
|
||||
|
||||
internal static int WriteDateTimeOffset(char[] chars, int start, TimeSpan offset, DateFormatHandling format)
|
||||
{
|
||||
chars[start++] = (offset.Ticks >= 0L) ? '+' : '-';
|
||||
|
||||
int absHours = Math.Abs(offset.Hours);
|
||||
CopyIntToCharArray(chars, start, absHours, 2);
|
||||
start += 2;
|
||||
|
||||
if (format == DateFormatHandling.IsoDateFormat)
|
||||
chars[start++] = ':';
|
||||
|
||||
int absMinutes = Math.Abs(offset.Minutes);
|
||||
CopyIntToCharArray(chars, start, absMinutes, 2);
|
||||
start += 2;
|
||||
|
||||
return start;
|
||||
}
|
||||
|
||||
#if !NET20
|
||||
internal static void WriteDateTimeOffsetString(TextWriter writer, DateTimeOffset value, DateFormatHandling format, string formatString, CultureInfo culture)
|
||||
{
|
||||
if (string.IsNullOrEmpty(formatString))
|
||||
{
|
||||
char[] chars = new char[64];
|
||||
int pos = WriteDateTimeString(chars, 0, (format == DateFormatHandling.IsoDateFormat) ? value.DateTime : value.UtcDateTime, value.Offset, DateTimeKind.Local, format);
|
||||
|
||||
writer.Write(chars, 0, pos);
|
||||
}
|
||||
else
|
||||
{
|
||||
writer.Write(value.ToString(formatString, culture));
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#endregion
|
||||
|
||||
private static void GetDateValues(DateTime td, out int year, out int month, out int day)
|
||||
{
|
||||
long ticks = td.Ticks;
|
||||
// n = number of days since 1/1/0001
|
||||
int n = (int) (ticks/TicksPerDay);
|
||||
// y400 = number of whole 400-year periods since 1/1/0001
|
||||
int y400 = n/DaysPer400Years;
|
||||
// n = day number within 400-year period
|
||||
n -= y400*DaysPer400Years;
|
||||
// y100 = number of whole 100-year periods within 400-year period
|
||||
int y100 = n/DaysPer100Years;
|
||||
// Last 100-year period has an extra day, so decrement result if 4
|
||||
if (y100 == 4)
|
||||
y100 = 3;
|
||||
// n = day number within 100-year period
|
||||
n -= y100*DaysPer100Years;
|
||||
// y4 = number of whole 4-year periods within 100-year period
|
||||
int y4 = n/DaysPer4Years;
|
||||
// n = day number within 4-year period
|
||||
n -= y4*DaysPer4Years;
|
||||
// y1 = number of whole years within 4-year period
|
||||
int y1 = n/DaysPerYear;
|
||||
// Last year has an extra day, so decrement result if 4
|
||||
if (y1 == 4)
|
||||
y1 = 3;
|
||||
|
||||
year = y400*400 + y100*100 + y4*4 + y1 + 1;
|
||||
|
||||
// n = day number within year
|
||||
n -= y1*DaysPerYear;
|
||||
|
||||
// Leap year calculation looks different from IsLeapYear since y1, y4,
|
||||
// and y100 are relative to year 1, not year 0
|
||||
bool leapYear = y1 == 3 && (y4 != 24 || y100 == 3);
|
||||
int[] days = leapYear ? DaysToMonth366 : DaysToMonth365;
|
||||
// All months have less than 32 days, so n >> 5 is a good conservative
|
||||
// estimate for the month
|
||||
int m = n >> 5 + 1;
|
||||
// m = 1-based month number
|
||||
while (n >= days[m])
|
||||
{
|
||||
m++;
|
||||
}
|
||||
|
||||
month = m;
|
||||
|
||||
// Return 1-based day-of-month
|
||||
day = n - days[m - 1] + 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user