2
// Copyright (c) 2007 James Newton-King
4
// Permission is hereby granted, free of charge, to any person
5
// obtaining a copy of this software and associated documentation
6
// files (the "Software"), to deal in the Software without
7
// restriction, including without limitation the rights to use,
8
// copy, modify, merge, publish, distribute, sublicense, and/or sell
9
// copies of the Software, and to permit persons to whom the
10
// Software is furnished to do so, subject to the following
13
// The above copyright notice and this permission notice shall be
14
// included in all copies or substantial portions of the Software.
16
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
18
// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
20
// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
21
// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
22
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
23
// OTHER DEALINGS IN THE SOFTWARE.
27
using System.Collections.Generic;
29
using System.Runtime.Serialization;
31
#if !(NET20 || NET35 || SILVERLIGHT)
32
using System.Threading.Tasks;
35
using Newtonsoft.Json.Converters;
36
using Newtonsoft.Json.Linq;
37
using Newtonsoft.Json.Tests.Serialization;
38
using Newtonsoft.Json.Tests.TestObjects;
39
using Newtonsoft.Json.Utilities;
41
using NUnit.Framework;
43
using Microsoft.VisualStudio.TestPlatform.UnitTestFramework;
44
using TestFixture = Microsoft.VisualStudio.TestPlatform.UnitTestFramework.TestClassAttribute;
45
using Test = Microsoft.VisualStudio.TestPlatform.UnitTestFramework.TestMethodAttribute;
48
namespace Newtonsoft.Json.Tests
51
public class JsonConvertTest : TestFixtureBase
54
public void DeserializeObject_EmptyString()
56
object result = JsonConvert.DeserializeObject(string.Empty);
57
Assert.IsNull(result);
61
public void DeserializeObject_Integer()
63
object result = JsonConvert.DeserializeObject("1");
64
Assert.AreEqual(1L, result);
68
public void DeserializeObject_Integer_EmptyString()
70
int? value = JsonConvert.DeserializeObject<int?>("");
75
public void DeserializeObject_Decimal_EmptyString()
77
decimal? value = JsonConvert.DeserializeObject<decimal?>("");
82
public void DeserializeObject_DateTime_EmptyString()
84
DateTime? value = JsonConvert.DeserializeObject<DateTime?>("");
89
public void EscapeJavaScriptString()
93
result = JavaScriptUtils.ToEscapedJavaScriptString("How now brown cow?", '"', true);
94
Assert.AreEqual(@"""How now brown cow?""", result);
96
result = JavaScriptUtils.ToEscapedJavaScriptString("How now 'brown' cow?", '"', true);
97
Assert.AreEqual(@"""How now 'brown' cow?""", result);
99
result = JavaScriptUtils.ToEscapedJavaScriptString("How now <brown> cow?", '"', true);
100
Assert.AreEqual(@"""How now <brown> cow?""", result);
102
result = JavaScriptUtils.ToEscapedJavaScriptString(@"How
103
now brown cow?", '"', true);
104
Assert.AreEqual(@"""How \r\nnow brown cow?""", result);
106
result = JavaScriptUtils.ToEscapedJavaScriptString("\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007", '"', true);
107
Assert.AreEqual(@"""\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007""", result);
110
JavaScriptUtils.ToEscapedJavaScriptString("\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013", '"', true);
111
Assert.AreEqual(@"""\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013""", result);
114
JavaScriptUtils.ToEscapedJavaScriptString(
115
"\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f ", '"', true);
116
Assert.AreEqual(@"""\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f """, result);
119
JavaScriptUtils.ToEscapedJavaScriptString(
120
"!\"#$%&\u0027()*+,-./0123456789:;\u003c=\u003e?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]", '"', true);
121
Assert.AreEqual(@"""!\""#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]""", result);
123
result = JavaScriptUtils.ToEscapedJavaScriptString("^_`abcdefghijklmnopqrstuvwxyz{|}~", '"', true);
124
Assert.AreEqual(@"""^_`abcdefghijklmnopqrstuvwxyz{|}~""", result);
127
"\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f !\"#$%&\u0027()*+,-./0123456789:;\u003c=\u003e?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~";
129
@"""\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f !\""#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~""";
131
result = JavaScriptUtils.ToEscapedJavaScriptString(data, '"', true);
132
Assert.AreEqual(expected, result);
134
result = JavaScriptUtils.ToEscapedJavaScriptString("Fred's cat.", '\'', true);
135
Assert.AreEqual(result, @"'Fred\'s cat.'");
137
result = JavaScriptUtils.ToEscapedJavaScriptString(@"""How are you gentlemen?"" said Cats.", '"', true);
138
Assert.AreEqual(result, @"""\""How are you gentlemen?\"" said Cats.""");
140
result = JavaScriptUtils.ToEscapedJavaScriptString(@"""How are' you gentlemen?"" said Cats.", '"', true);
141
Assert.AreEqual(result, @"""\""How are' you gentlemen?\"" said Cats.""");
143
result = JavaScriptUtils.ToEscapedJavaScriptString(@"Fred's ""cat"".", '\'', true);
144
Assert.AreEqual(result, @"'Fred\'s ""cat"".'");
146
result = JavaScriptUtils.ToEscapedJavaScriptString("\u001farray\u003caddress");
147
Assert.AreEqual(result, @"""\u001farray<address""");
151
public void EscapeJavaScriptString_UnicodeLinefeeds()
155
result = JavaScriptUtils.ToEscapedJavaScriptString("before" + '\u0085' + "after", '"', true);
156
Assert.AreEqual(@"""before\u0085after""", result);
158
result = JavaScriptUtils.ToEscapedJavaScriptString("before" + '\u2028' + "after", '"', true);
159
Assert.AreEqual(@"""before\u2028after""", result);
161
result = JavaScriptUtils.ToEscapedJavaScriptString("before" + '\u2029' + "after", '"', true);
162
Assert.AreEqual(@"""before\u2029after""", result);
166
public void ToStringInvalid()
168
ExceptionAssert.Throws<ArgumentException>("Unsupported type: System.Version. Use the JsonSerializer class to get the object's JSON representation.",
171
JsonConvert.ToString(new Version(1, 0));
176
public void GuidToString()
178
Guid guid = new Guid("BED7F4EA-1A96-11d2-8F08-00A0C9A6186D");
179
string json = JsonConvert.ToString(guid);
180
Assert.AreEqual(@"""bed7f4ea-1a96-11d2-8f08-00a0c9a6186d""", json);
184
public void EnumToString()
186
string json = JsonConvert.ToString(StringComparison.CurrentCultureIgnoreCase);
187
Assert.AreEqual("1", json);
191
public void ObjectToString()
196
Assert.AreEqual("1", JsonConvert.ToString(value));
199
Assert.AreEqual("1.1", JsonConvert.ToString(value));
202
Assert.AreEqual("1.1", JsonConvert.ToString(value));
205
Assert.AreEqual("1.1", JsonConvert.ToString(value));
208
Assert.AreEqual("1", JsonConvert.ToString(value));
211
Assert.AreEqual("1", JsonConvert.ToString(value));
214
Assert.AreEqual("1", JsonConvert.ToString(value));
217
Assert.AreEqual("1", JsonConvert.ToString(value));
220
Assert.AreEqual("1", JsonConvert.ToString(value));
223
Assert.AreEqual("1", JsonConvert.ToString(value));
226
Assert.AreEqual("1", JsonConvert.ToString(value));
228
value = new DateTime(JsonConvert.InitialJavaScriptDateTicks, DateTimeKind.Utc);
229
Assert.AreEqual(@"""1970-01-01T00:00:00Z""", JsonConvert.ToString(value));
231
value = new DateTime(JsonConvert.InitialJavaScriptDateTicks, DateTimeKind.Utc);
232
Assert.AreEqual(@"""\/Date(0)\/""", JsonConvert.ToString((DateTime)value, DateFormatHandling.MicrosoftDateFormat, DateTimeZoneHandling.RoundtripKind));
234
#if !PocketPC && !NET20
235
value = new DateTimeOffset(JsonConvert.InitialJavaScriptDateTicks, TimeSpan.Zero);
236
Assert.AreEqual(@"""1970-01-01T00:00:00+00:00""", JsonConvert.ToString(value));
238
value = new DateTimeOffset(JsonConvert.InitialJavaScriptDateTicks, TimeSpan.Zero);
239
Assert.AreEqual(@"""\/Date(0+0000)\/""", JsonConvert.ToString((DateTimeOffset)value, DateFormatHandling.MicrosoftDateFormat));
243
Assert.AreEqual("null", JsonConvert.ToString(value));
245
#if !(NETFX_CORE || PORTABLE)
246
value = DBNull.Value;
247
Assert.AreEqual("null", JsonConvert.ToString(value));
250
value = "I am a string";
251
Assert.AreEqual(@"""I am a string""", JsonConvert.ToString(value));
254
Assert.AreEqual("true", JsonConvert.ToString(value));
257
Assert.AreEqual(@"""c""", JsonConvert.ToString(value));
261
public void TestInvalidStrings()
263
ExceptionAssert.Throws<JsonReaderException>("Additional text encountered after finished reading JSON content: t. Path '', line 1, position 19.",
266
string orig = @"this is a string ""that has quotes"" ";
268
string serialized = JsonConvert.SerializeObject(orig);
270
// *** Make string invalid by stripping \" \"
271
serialized = serialized.Replace(@"\""", "\"");
273
JsonConvert.DeserializeObject<string>(serialized);
278
public void DeserializeValueObjects()
280
int i = JsonConvert.DeserializeObject<int>("1");
281
Assert.AreEqual(1, i);
283
#if !PocketPC && !NET20
284
DateTimeOffset d = JsonConvert.DeserializeObject<DateTimeOffset>(@"""\/Date(-59011455539000+0000)\/""");
285
Assert.AreEqual(new DateTimeOffset(new DateTime(100, 1, 1, 1, 1, 1, DateTimeKind.Utc)), d);
288
bool b = JsonConvert.DeserializeObject<bool>("true");
289
Assert.AreEqual(true, b);
291
object n = JsonConvert.DeserializeObject<object>("null");
292
Assert.AreEqual(null, n);
294
object u = JsonConvert.DeserializeObject<object>("undefined");
295
Assert.AreEqual(null, u);
299
public void FloatToString()
301
Assert.AreEqual("1.1", JsonConvert.ToString(1.1));
302
Assert.AreEqual("1.11", JsonConvert.ToString(1.11));
303
Assert.AreEqual("1.111", JsonConvert.ToString(1.111));
304
Assert.AreEqual("1.1111", JsonConvert.ToString(1.1111));
305
Assert.AreEqual("1.11111", JsonConvert.ToString(1.11111));
306
Assert.AreEqual("1.111111", JsonConvert.ToString(1.111111));
307
Assert.AreEqual("1.0", JsonConvert.ToString(1.0));
308
Assert.AreEqual("1.0", JsonConvert.ToString(1d));
309
Assert.AreEqual("-1.0", JsonConvert.ToString(-1d));
310
Assert.AreEqual("1.01", JsonConvert.ToString(1.01));
311
Assert.AreEqual("1.001", JsonConvert.ToString(1.001));
312
Assert.AreEqual(JsonConvert.PositiveInfinity, JsonConvert.ToString(Double.PositiveInfinity));
313
Assert.AreEqual(JsonConvert.NegativeInfinity, JsonConvert.ToString(Double.NegativeInfinity));
314
Assert.AreEqual(JsonConvert.NaN, JsonConvert.ToString(Double.NaN));
318
public void DecimalToString()
320
Assert.AreEqual("1.1", JsonConvert.ToString(1.1m));
321
Assert.AreEqual("1.11", JsonConvert.ToString(1.11m));
322
Assert.AreEqual("1.111", JsonConvert.ToString(1.111m));
323
Assert.AreEqual("1.1111", JsonConvert.ToString(1.1111m));
324
Assert.AreEqual("1.11111", JsonConvert.ToString(1.11111m));
325
Assert.AreEqual("1.111111", JsonConvert.ToString(1.111111m));
326
Assert.AreEqual("1.0", JsonConvert.ToString(1.0m));
327
Assert.AreEqual("-1.0", JsonConvert.ToString(-1.0m));
328
Assert.AreEqual("-1.0", JsonConvert.ToString(-1m));
329
Assert.AreEqual("1.0", JsonConvert.ToString(1m));
330
Assert.AreEqual("1.01", JsonConvert.ToString(1.01m));
331
Assert.AreEqual("1.001", JsonConvert.ToString(1.001m));
332
Assert.AreEqual("79228162514264337593543950335.0", JsonConvert.ToString(Decimal.MaxValue));
333
Assert.AreEqual("-79228162514264337593543950335.0", JsonConvert.ToString(Decimal.MinValue));
337
public void StringEscaping()
339
string v = @"It's a good day
342
string json = JsonConvert.ToString(v);
343
Assert.AreEqual(@"""It's a good day\r\n\""sunshine\""""", json);
347
public void WriteDateTime()
349
DateTimeResult result = null;
351
result = TestDateTime("DateTime Max", DateTime.MaxValue);
352
Assert.AreEqual("9999-12-31T23:59:59.9999999", result.IsoDateRoundtrip);
353
Assert.AreEqual("9999-12-31T23:59:59.9999999" + GetOffset(DateTime.MaxValue, DateFormatHandling.IsoDateFormat), result.IsoDateLocal);
354
Assert.AreEqual("9999-12-31T23:59:59.9999999", result.IsoDateUnspecified);
355
Assert.AreEqual("9999-12-31T23:59:59.9999999Z", result.IsoDateUtc);
356
Assert.AreEqual(@"\/Date(253402300799999)\/", result.MsDateRoundtrip);
357
Assert.AreEqual(@"\/Date(253402300799999" + GetOffset(DateTime.MaxValue, DateFormatHandling.MicrosoftDateFormat) + @")\/", result.MsDateLocal);
358
Assert.AreEqual(@"\/Date(253402300799999)\/", result.MsDateUnspecified);
359
Assert.AreEqual(@"\/Date(253402300799999)\/", result.MsDateUtc);
361
DateTime year2000local = new DateTime(2000, 1, 1, 1, 1, 1, DateTimeKind.Local);
362
string localToUtcDate = year2000local.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ss.FFFFFFFK");
364
result = TestDateTime("DateTime Local", year2000local);
365
Assert.AreEqual("2000-01-01T01:01:01" + GetOffset(year2000local, DateFormatHandling.IsoDateFormat), result.IsoDateRoundtrip);
366
Assert.AreEqual("2000-01-01T01:01:01" + GetOffset(year2000local, DateFormatHandling.IsoDateFormat), result.IsoDateLocal);
367
Assert.AreEqual("2000-01-01T01:01:01", result.IsoDateUnspecified);
368
Assert.AreEqual(localToUtcDate, result.IsoDateUtc);
369
Assert.AreEqual(@"\/Date(" + JsonConvert.ConvertDateTimeToJavaScriptTicks(year2000local) + GetOffset(year2000local, DateFormatHandling.MicrosoftDateFormat) + @")\/", result.MsDateRoundtrip);
370
Assert.AreEqual(@"\/Date(" + JsonConvert.ConvertDateTimeToJavaScriptTicks(year2000local) + GetOffset(year2000local, DateFormatHandling.MicrosoftDateFormat) + @")\/", result.MsDateLocal);
371
Assert.AreEqual(@"\/Date(" + JsonConvert.ConvertDateTimeToJavaScriptTicks(year2000local) + GetOffset(year2000local, DateFormatHandling.MicrosoftDateFormat) + @")\/", result.MsDateUnspecified);
372
Assert.AreEqual(@"\/Date(" + JsonConvert.ConvertDateTimeToJavaScriptTicks(year2000local) + @")\/", result.MsDateUtc);
374
DateTime millisecondsLocal = new DateTime(2000, 1, 1, 1, 1, 1, 999, DateTimeKind.Local);
375
localToUtcDate = millisecondsLocal.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ss.FFFFFFFK");
377
result = TestDateTime("DateTime Local with milliseconds", millisecondsLocal);
378
Assert.AreEqual("2000-01-01T01:01:01.999" + GetOffset(millisecondsLocal, DateFormatHandling.IsoDateFormat), result.IsoDateRoundtrip);
379
Assert.AreEqual("2000-01-01T01:01:01.999" + GetOffset(millisecondsLocal, DateFormatHandling.IsoDateFormat), result.IsoDateLocal);
380
Assert.AreEqual("2000-01-01T01:01:01.999", result.IsoDateUnspecified);
381
Assert.AreEqual(localToUtcDate, result.IsoDateUtc);
382
Assert.AreEqual(@"\/Date(" + JsonConvert.ConvertDateTimeToJavaScriptTicks(millisecondsLocal) + GetOffset(millisecondsLocal, DateFormatHandling.MicrosoftDateFormat) + @")\/", result.MsDateRoundtrip);
383
Assert.AreEqual(@"\/Date(" + JsonConvert.ConvertDateTimeToJavaScriptTicks(millisecondsLocal) + GetOffset(millisecondsLocal, DateFormatHandling.MicrosoftDateFormat) + @")\/", result.MsDateLocal);
384
Assert.AreEqual(@"\/Date(" + JsonConvert.ConvertDateTimeToJavaScriptTicks(millisecondsLocal) + GetOffset(millisecondsLocal, DateFormatHandling.MicrosoftDateFormat) + @")\/", result.MsDateUnspecified);
385
Assert.AreEqual(@"\/Date(" + JsonConvert.ConvertDateTimeToJavaScriptTicks(millisecondsLocal) + @")\/", result.MsDateUtc);
387
DateTime ticksLocal = new DateTime(634663873826822481, DateTimeKind.Local);
388
localToUtcDate = ticksLocal.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ss.FFFFFFFK");
390
result = TestDateTime("DateTime Local with ticks", ticksLocal);
391
Assert.AreEqual("2012-03-03T16:03:02.6822481" + GetOffset(ticksLocal, DateFormatHandling.IsoDateFormat), result.IsoDateRoundtrip);
392
Assert.AreEqual("2012-03-03T16:03:02.6822481" + GetOffset(ticksLocal, DateFormatHandling.IsoDateFormat), result.IsoDateLocal);
393
Assert.AreEqual("2012-03-03T16:03:02.6822481", result.IsoDateUnspecified);
394
Assert.AreEqual(localToUtcDate, result.IsoDateUtc);
395
Assert.AreEqual(@"\/Date(" + JsonConvert.ConvertDateTimeToJavaScriptTicks(ticksLocal) + GetOffset(ticksLocal, DateFormatHandling.MicrosoftDateFormat) + @")\/", result.MsDateRoundtrip);
396
Assert.AreEqual(@"\/Date(" + JsonConvert.ConvertDateTimeToJavaScriptTicks(ticksLocal) + GetOffset(ticksLocal, DateFormatHandling.MicrosoftDateFormat) + @")\/", result.MsDateLocal);
397
Assert.AreEqual(@"\/Date(" + JsonConvert.ConvertDateTimeToJavaScriptTicks(ticksLocal) + GetOffset(ticksLocal, DateFormatHandling.MicrosoftDateFormat) + @")\/", result.MsDateUnspecified);
398
Assert.AreEqual(@"\/Date(" + JsonConvert.ConvertDateTimeToJavaScriptTicks(ticksLocal) + @")\/", result.MsDateUtc);
400
DateTime year2000Unspecified = new DateTime(2000, 1, 1, 1, 1, 1, DateTimeKind.Unspecified);
402
result = TestDateTime("DateTime Unspecified", year2000Unspecified);
403
Assert.AreEqual("2000-01-01T01:01:01", result.IsoDateRoundtrip);
404
Assert.AreEqual("2000-01-01T01:01:01" + GetOffset(year2000Unspecified, DateFormatHandling.IsoDateFormat), result.IsoDateLocal);
405
Assert.AreEqual("2000-01-01T01:01:01", result.IsoDateUnspecified);
406
Assert.AreEqual("2000-01-01T01:01:01Z", result.IsoDateUtc);
407
Assert.AreEqual(@"\/Date(" + JsonConvert.ConvertDateTimeToJavaScriptTicks(year2000Unspecified) + GetOffset(year2000Unspecified, DateFormatHandling.MicrosoftDateFormat) + @")\/", result.MsDateRoundtrip);
408
Assert.AreEqual(@"\/Date(" + JsonConvert.ConvertDateTimeToJavaScriptTicks(year2000Unspecified) + GetOffset(year2000Unspecified, DateFormatHandling.MicrosoftDateFormat) + @")\/", result.MsDateLocal);
409
Assert.AreEqual(@"\/Date(" + JsonConvert.ConvertDateTimeToJavaScriptTicks(year2000Unspecified) + GetOffset(year2000Unspecified, DateFormatHandling.MicrosoftDateFormat) + @")\/", result.MsDateUnspecified);
410
Assert.AreEqual(@"\/Date(" + JsonConvert.ConvertDateTimeToJavaScriptTicks(year2000Unspecified.ToLocalTime()) + @")\/", result.MsDateUtc);
412
DateTime year2000Utc = new DateTime(2000, 1, 1, 1, 1, 1, DateTimeKind.Utc);
413
string utcTolocalDate = year2000Utc.ToLocalTime().ToString("yyyy-MM-ddTHH:mm:ss");
415
result = TestDateTime("DateTime Utc", year2000Utc);
416
Assert.AreEqual("2000-01-01T01:01:01Z", result.IsoDateRoundtrip);
417
Assert.AreEqual(utcTolocalDate + GetOffset(year2000Utc, DateFormatHandling.IsoDateFormat), result.IsoDateLocal);
418
Assert.AreEqual("2000-01-01T01:01:01", result.IsoDateUnspecified);
419
Assert.AreEqual("2000-01-01T01:01:01Z", result.IsoDateUtc);
420
Assert.AreEqual(@"\/Date(946688461000)\/", result.MsDateRoundtrip);
421
Assert.AreEqual(@"\/Date(946688461000" + GetOffset(year2000Utc, DateFormatHandling.MicrosoftDateFormat) + @")\/", result.MsDateLocal);
422
Assert.AreEqual(@"\/Date(" + JsonConvert.ConvertDateTimeToJavaScriptTicks(DateTime.SpecifyKind(year2000Utc, DateTimeKind.Unspecified)) + GetOffset(year2000Utc, DateFormatHandling.MicrosoftDateFormat) + @")\/", result.MsDateUnspecified);
423
Assert.AreEqual(@"\/Date(946688461000)\/", result.MsDateUtc);
425
DateTime unixEpoc = new DateTime(621355968000000000, DateTimeKind.Utc);
426
utcTolocalDate = unixEpoc.ToLocalTime().ToString("yyyy-MM-ddTHH:mm:ss");
428
result = TestDateTime("DateTime Unix Epoc", unixEpoc);
429
Assert.AreEqual("1970-01-01T00:00:00Z", result.IsoDateRoundtrip);
430
Assert.AreEqual(utcTolocalDate + GetOffset(unixEpoc, DateFormatHandling.IsoDateFormat), result.IsoDateLocal);
431
Assert.AreEqual("1970-01-01T00:00:00", result.IsoDateUnspecified);
432
Assert.AreEqual("1970-01-01T00:00:00Z", result.IsoDateUtc);
433
Assert.AreEqual(@"\/Date(0)\/", result.MsDateRoundtrip);
434
Assert.AreEqual(@"\/Date(0" + GetOffset(unixEpoc, DateFormatHandling.MicrosoftDateFormat) + @")\/", result.MsDateLocal);
435
Assert.AreEqual(@"\/Date(" + JsonConvert.ConvertDateTimeToJavaScriptTicks(DateTime.SpecifyKind(unixEpoc, DateTimeKind.Unspecified)) + GetOffset(unixEpoc, DateFormatHandling.MicrosoftDateFormat) + @")\/", result.MsDateUnspecified);
436
Assert.AreEqual(@"\/Date(0)\/", result.MsDateUtc);
438
result = TestDateTime("DateTime Min", DateTime.MinValue);
439
Assert.AreEqual("0001-01-01T00:00:00", result.IsoDateRoundtrip);
440
Assert.AreEqual("0001-01-01T00:00:00" + GetOffset(DateTime.MinValue, DateFormatHandling.IsoDateFormat), result.IsoDateLocal);
441
Assert.AreEqual("0001-01-01T00:00:00", result.IsoDateUnspecified);
442
Assert.AreEqual("0001-01-01T00:00:00Z", result.IsoDateUtc);
443
Assert.AreEqual(@"\/Date(-62135596800000)\/", result.MsDateRoundtrip);
444
Assert.AreEqual(@"\/Date(-62135596800000" + GetOffset(DateTime.MinValue, DateFormatHandling.MicrosoftDateFormat) + @")\/", result.MsDateLocal);
445
Assert.AreEqual(@"\/Date(-62135596800000)\/", result.MsDateUnspecified);
446
Assert.AreEqual(@"\/Date(-62135596800000)\/", result.MsDateUtc);
448
result = TestDateTime("DateTime Default", default(DateTime));
449
Assert.AreEqual("0001-01-01T00:00:00", result.IsoDateRoundtrip);
450
Assert.AreEqual("0001-01-01T00:00:00" + GetOffset(default(DateTime), DateFormatHandling.IsoDateFormat), result.IsoDateLocal);
451
Assert.AreEqual("0001-01-01T00:00:00", result.IsoDateUnspecified);
452
Assert.AreEqual("0001-01-01T00:00:00Z", result.IsoDateUtc);
453
Assert.AreEqual(@"\/Date(-62135596800000)\/", result.MsDateRoundtrip);
454
Assert.AreEqual(@"\/Date(-62135596800000" + GetOffset(default(DateTime), DateFormatHandling.MicrosoftDateFormat) + @")\/", result.MsDateLocal);
455
Assert.AreEqual(@"\/Date(-62135596800000)\/", result.MsDateUnspecified);
456
Assert.AreEqual(@"\/Date(-62135596800000)\/", result.MsDateUtc);
459
result = TestDateTime("DateTimeOffset TimeSpan Zero", new DateTimeOffset(2000, 1, 1, 1, 1, 1, TimeSpan.Zero));
460
Assert.AreEqual("2000-01-01T01:01:01+00:00", result.IsoDateRoundtrip);
461
Assert.AreEqual(@"\/Date(946688461000+0000)\/", result.MsDateRoundtrip);
463
result = TestDateTime("DateTimeOffset TimeSpan 1 hour", new DateTimeOffset(2000, 1, 1, 1, 1, 1, TimeSpan.FromHours(1)));
464
Assert.AreEqual("2000-01-01T01:01:01+01:00", result.IsoDateRoundtrip);
465
Assert.AreEqual(@"\/Date(946684861000+0100)\/", result.MsDateRoundtrip);
467
result = TestDateTime("DateTimeOffset TimeSpan 1.5 hour", new DateTimeOffset(2000, 1, 1, 1, 1, 1, TimeSpan.FromHours(1.5)));
468
Assert.AreEqual("2000-01-01T01:01:01+01:30", result.IsoDateRoundtrip);
469
Assert.AreEqual(@"\/Date(946683061000+0130)\/", result.MsDateRoundtrip);
471
result = TestDateTime("DateTimeOffset TimeSpan 13 hour", new DateTimeOffset(2000, 1, 1, 1, 1, 1, TimeSpan.FromHours(13)));
472
Assert.AreEqual("2000-01-01T01:01:01+13:00", result.IsoDateRoundtrip);
473
Assert.AreEqual(@"\/Date(946641661000+1300)\/", result.MsDateRoundtrip);
475
result = TestDateTime("DateTimeOffset TimeSpan with ticks", new DateTimeOffset(634663873826822481, TimeSpan.Zero));
476
Assert.AreEqual("2012-03-03T16:03:02.6822481+00:00", result.IsoDateRoundtrip);
477
Assert.AreEqual(@"\/Date(1330790582682+0000)\/", result.MsDateRoundtrip);
479
result = TestDateTime("DateTimeOffset Min", DateTimeOffset.MinValue);
480
Assert.AreEqual("0001-01-01T00:00:00+00:00", result.IsoDateRoundtrip);
481
Assert.AreEqual(@"\/Date(-62135596800000+0000)\/", result.MsDateRoundtrip);
483
result = TestDateTime("DateTimeOffset Max", DateTimeOffset.MaxValue);
484
Assert.AreEqual("9999-12-31T23:59:59.9999999+00:00", result.IsoDateRoundtrip);
485
Assert.AreEqual(@"\/Date(253402300799999+0000)\/", result.MsDateRoundtrip);
487
result = TestDateTime("DateTimeOffset Default", default(DateTimeOffset));
488
Assert.AreEqual("0001-01-01T00:00:00+00:00", result.IsoDateRoundtrip);
489
Assert.AreEqual(@"\/Date(-62135596800000+0000)\/", result.MsDateRoundtrip);
493
public class DateTimeResult
495
public string IsoDateRoundtrip { get; set; }
496
public string IsoDateLocal { get; set; }
497
public string IsoDateUnspecified { get; set; }
498
public string IsoDateUtc { get; set; }
500
public string MsDateRoundtrip { get; set; }
501
public string MsDateLocal { get; set; }
502
public string MsDateUnspecified { get; set; }
503
public string MsDateUtc { get; set; }
506
private DateTimeResult TestDateTime<T>(string name, T value)
508
Console.WriteLine(name);
510
DateTimeResult result = new DateTimeResult();
512
result.IsoDateRoundtrip = TestDateTimeFormat(value, DateFormatHandling.IsoDateFormat, DateTimeZoneHandling.RoundtripKind);
513
if (value is DateTime)
515
result.IsoDateLocal = TestDateTimeFormat(value, DateFormatHandling.IsoDateFormat, DateTimeZoneHandling.Local);
516
result.IsoDateUnspecified = TestDateTimeFormat(value, DateFormatHandling.IsoDateFormat, DateTimeZoneHandling.Unspecified);
517
result.IsoDateUtc = TestDateTimeFormat(value, DateFormatHandling.IsoDateFormat, DateTimeZoneHandling.Utc);
520
result.MsDateRoundtrip = TestDateTimeFormat(value, DateFormatHandling.MicrosoftDateFormat, DateTimeZoneHandling.RoundtripKind);
521
if (value is DateTime)
523
result.MsDateLocal = TestDateTimeFormat(value, DateFormatHandling.MicrosoftDateFormat, DateTimeZoneHandling.Local);
524
result.MsDateUnspecified = TestDateTimeFormat(value, DateFormatHandling.MicrosoftDateFormat, DateTimeZoneHandling.Unspecified);
525
result.MsDateUtc = TestDateTimeFormat(value, DateFormatHandling.MicrosoftDateFormat, DateTimeZoneHandling.Utc);
528
TestDateTimeFormat(value, new IsoDateTimeConverter());
531
if (value is DateTime)
533
Console.WriteLine(XmlConvert.ToString((DateTime)(object)value, XmlDateTimeSerializationMode.RoundtripKind));
537
Console.WriteLine(XmlConvert.ToString((DateTimeOffset)(object)value));
542
MemoryStream ms = new MemoryStream();
543
DataContractSerializer s = new DataContractSerializer(typeof(T));
544
s.WriteObject(ms, value);
545
string json = Encoding.UTF8.GetString(ms.ToArray(), 0, Convert.ToInt32(ms.Length));
546
Console.WriteLine(json);
554
private static string TestDateTimeFormat<T>(T value, DateFormatHandling format, DateTimeZoneHandling timeZoneHandling)
558
if (value is DateTime)
560
date = JsonConvert.ToString((DateTime)(object)value, format, timeZoneHandling);
565
date = JsonConvert.ToString((DateTimeOffset)(object)value, format);
569
Console.WriteLine(format.ToString("g") + "-" + timeZoneHandling.ToString("g") + ": " + date);
571
if (timeZoneHandling == DateTimeZoneHandling.RoundtripKind)
573
T parsed = JsonConvert.DeserializeObject<T>(date);
576
Assert.AreEqual(value, parsed);
580
long valueTicks = GetTicks(value);
581
long parsedTicks = GetTicks(parsed);
583
valueTicks = (valueTicks/10000)*10000;
585
Assert.AreEqual(valueTicks, parsedTicks);
589
return date.Trim('"');
592
private static void TestDateTimeFormat<T>(T value, JsonConverter converter)
594
string date = Write(value, converter);
596
Console.WriteLine(converter.GetType().Name + ": " + date);
598
T parsed = Read<T>(date, converter);
602
Assert.AreEqual(value, parsed);
606
// JavaScript ticks aren't as precise, recheck after rounding
607
long valueTicks = GetTicks(value);
608
long parsedTicks = GetTicks(parsed);
610
valueTicks = (valueTicks / 10000) * 10000;
612
Assert.AreEqual(valueTicks, parsedTicks);
616
public static long GetTicks(object value)
618
return (value is DateTime) ? ((DateTime)value).Ticks : ((DateTimeOffset)value).Ticks;
621
public static string Write(object value, JsonConverter converter)
623
StringWriter sw = new StringWriter();
624
JsonTextWriter writer = new JsonTextWriter(sw);
625
converter.WriteJson(writer, value, null);
628
return sw.ToString();
631
public static T Read<T>(string text, JsonConverter converter)
633
JsonTextReader reader = new JsonTextReader(new StringReader(text));
634
reader.ReadAsString();
636
return (T)converter.ReadJson(reader, typeof(T), null, null);
639
#if !(NET20 || NET35 || SILVERLIGHT || PORTABLE)
643
Task<string> task = null;
645
task = JsonConvert.SerializeObjectAsync(42);
648
Assert.AreEqual("42", task.Result);
650
task = JsonConvert.SerializeObjectAsync(new[] {1, 2, 3, 4, 5}, Formatting.Indented);
661
task = JsonConvert.SerializeObjectAsync(DateTime.MaxValue, Formatting.None, new JsonSerializerSettings
663
DateFormatHandling = DateFormatHandling.MicrosoftDateFormat
667
Assert.AreEqual(@"""\/Date(253402300799999)\/""", task.Result);
669
var taskObject = JsonConvert.DeserializeObjectAsync("[]");
672
CollectionAssert.AreEquivalent(new JArray(), (JArray)taskObject.Result);
674
Task<object> taskVersionArray = JsonConvert.DeserializeObjectAsync("['2.0']", typeof(Version[]), new JsonSerializerSettings
676
Converters = {new VersionConverter()}
678
taskVersionArray.Wait();
680
Version[] versionArray = (Version[])taskVersionArray.Result;
682
Assert.AreEqual(1, versionArray.Length);
683
Assert.AreEqual(2, versionArray[0].Major);
685
Task<int> taskInt = JsonConvert.DeserializeObjectAsync<int>("5");
688
Assert.AreEqual(5, taskInt.Result);
690
var taskVersion = JsonConvert.DeserializeObjectAsync<Version>("'2.0'", new JsonSerializerSettings
692
Converters = {new VersionConverter()}
696
Assert.AreEqual(2, taskVersion.Result.Major);
698
Movie p = new Movie();
699
p.Name = "Existing,";
701
Task taskVoid = JsonConvert.PopulateObjectAsync("{'Name':'Appended'}", p, new JsonSerializerSettings
703
Converters = new List<JsonConverter> { new JsonSerializerTest.StringAppenderConverter() }
708
Assert.AreEqual("Existing,Appended", p.Name);
713
public void SerializeObjectDateTimeZoneHandling()
715
string json = JsonConvert.SerializeObject(
716
new DateTime(2000, 1, 1, 1, 1, 1, DateTimeKind.Unspecified),
717
new JsonSerializerSettings
719
DateTimeZoneHandling = DateTimeZoneHandling.Utc
722
Assert.AreEqual(@"""2000-01-01T01:01:01Z""", json);
726
public void StackOverflowTest()
728
StringBuilder sb = new StringBuilder();
731
for (int i = 0; i < depth; i++)
738
for (int i = 0; i < depth; i++)
743
string json = sb.ToString();
744
JsonSerializer serializer = new JsonSerializer() { };
745
serializer.Deserialize<Nest>(new JsonTextReader(new StringReader(json)));
750
public Nest A { get; set; }
b'\\ No newline at end of file'