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;
28 #if !SILVERLIGHT && !PocketPC && !NET20
29 using System.ComponentModel.DataAnnotations;
30 using System.Configuration;
31 using System.Runtime.CompilerServices;
32 using System.Threading;
33 using System.Web.Script.Serialization;
36 using NUnit.Framework;
37 using Newtonsoft.Json;
39 using System.Collections;
41 using System.Xml.Serialization;
42 using System.Collections.ObjectModel;
43 using Newtonsoft.Json.Linq;
45 using Newtonsoft.Json.Converters;
46 #if !PocketPC && !NET20 && !WINDOWS_PHONE
47 using System.Runtime.Serialization.Json;
49 using Newtonsoft.Json.Tests.TestObjects;
50 using System.Runtime.Serialization;
51 using System.Globalization;
52 using Newtonsoft.Json.Utilities;
53 using System.Reflection;
54 #if !NET20 && !SILVERLIGHT
55 using System.Xml.Linq;
56 using System.Text.RegularExpressions;
57 using System.Collections.Specialized;
58 using System.Linq.Expressions;
60 #if !(NET35 || NET20 || WINDOWS_PHONE)
62 using System.ComponentModel;
65 namespace Newtonsoft.Json.Tests.Serialization
67 public class JsonSerializerTest : TestFixtureBase
70 public void PersonTypedObjectDeserialization()
72 Store store = new Store();
74 string jsonText = JsonConvert.SerializeObject(store);
76 Store deserializedStore = (Store)JsonConvert.DeserializeObject(jsonText, typeof(Store));
78 Assert.AreEqual(store.Establised, deserializedStore.Establised);
79 Assert.AreEqual(store.product.Count, deserializedStore.product.Count);
81 Console.WriteLine(jsonText);
85 public void TypedObjectDeserialization()
87 Product product = new Product();
89 product.Name = "Apple";
90 product.ExpiryDate = new DateTime(2008, 12, 28);
91 product.Price = 3.99M;
92 product.Sizes = new string[] { "Small", "Medium", "Large" };
94 string output = JsonConvert.SerializeObject(product);
97 // "ExpiryDate": "\/Date(1230375600000+1300)\/",
106 Product deserializedProduct = (Product)JsonConvert.DeserializeObject(output, typeof(Product));
108 Assert.AreEqual("Apple", deserializedProduct.Name);
109 Assert.AreEqual(new DateTime(2008, 12, 28), deserializedProduct.ExpiryDate);
110 Assert.AreEqual(3.99, deserializedProduct.Price);
111 Assert.AreEqual("Small", deserializedProduct.Sizes[0]);
112 Assert.AreEqual("Medium", deserializedProduct.Sizes[1]);
113 Assert.AreEqual("Large", deserializedProduct.Sizes[2]);
117 //public void Advanced()
119 // Product product = new Product();
120 // product.ExpiryDate = new DateTime(2008, 12, 28);
122 // JsonSerializer serializer = new JsonSerializer();
123 // serializer.Converters.Add(new JavaScriptDateTimeConverter());
124 // serializer.NullValueHandling = NullValueHandling.Ignore;
126 // using (StreamWriter sw = new StreamWriter(@"c:\json.txt"))
127 // using (JsonWriter writer = new JsonTextWriter(sw))
129 // serializer.Serialize(writer, product);
130 // // {"ExpiryDate":new Date(1230375600000),"Price":0}
135 public void JsonConvertSerializer()
137 string value = @"{""Name"":""Orange"", ""Price"":3.99, ""ExpiryDate"":""01/24/2010 12:00:00""}";
139 Product p = JsonConvert.DeserializeObject(value, typeof(Product)) as Product;
141 Assert.AreEqual("Orange", p.Name);
142 Assert.AreEqual(new DateTime(2010, 1, 24, 12, 0, 0), p.ExpiryDate);
143 Assert.AreEqual(3.99, p.Price);
147 public void DeserializeJavaScriptDate()
149 DateTime dateValue = new DateTime(2010, 3, 30);
150 Dictionary<string, object> testDictionary = new Dictionary<string, object>();
151 testDictionary["date"] = dateValue;
153 string jsonText = JsonConvert.SerializeObject(testDictionary);
155 #if !PocketPC && !NET20 && !WINDOWS_PHONE
156 MemoryStream ms = new MemoryStream();
157 DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(Dictionary<string, object>));
158 serializer.WriteObject(ms, testDictionary);
160 byte[] data = ms.ToArray();
161 string output = Encoding.UTF8.GetString(data, 0, data.Length);
164 Dictionary<string, object> deserializedDictionary = (Dictionary<string, object>)JsonConvert.DeserializeObject(jsonText, typeof(Dictionary<string, object>));
165 DateTime deserializedDate = (DateTime)deserializedDictionary["date"];
167 Assert.AreEqual(dateValue, deserializedDate);
169 Console.WriteLine("DeserializeJavaScriptDate");
170 Console.WriteLine(jsonText);
172 Console.WriteLine(jsonText);
176 public void TestMethodExecutorObject()
178 MethodExecutorObject executorObject = new MethodExecutorObject();
179 executorObject.serverClassName = "BanSubs";
180 executorObject.serverMethodParams = new object[] { "21321546", "101", "1236", "D:\\1.txt" };
181 executorObject.clientGetResultFunction = "ClientBanSubsCB";
183 string output = JsonConvert.SerializeObject(executorObject);
185 MethodExecutorObject executorObject2 = JsonConvert.DeserializeObject(output, typeof(MethodExecutorObject)) as MethodExecutorObject;
187 Assert.AreNotSame(executorObject, executorObject2);
188 Assert.AreEqual(executorObject2.serverClassName, "BanSubs");
189 Assert.AreEqual(executorObject2.serverMethodParams.Length, 4);
190 Assert.Contains("101", executorObject2.serverMethodParams);
191 Assert.AreEqual(executorObject2.clientGetResultFunction, "ClientBanSubsCB");
196 public void HashtableDeserialization()
198 string value = @"{""Name"":""Orange"", ""Price"":3.99, ""ExpiryDate"":""01/24/2010 12:00:00""}";
200 Hashtable p = JsonConvert.DeserializeObject(value, typeof(Hashtable)) as Hashtable;
202 Assert.AreEqual("Orange", p["Name"].ToString());
206 public void TypedHashtableDeserialization()
208 string value = @"{""Name"":""Orange"", ""Hash"":{""ExpiryDate"":""01/24/2010 12:00:00"",""UntypedArray"":[""01/24/2010 12:00:00""]}}";
210 TypedSubHashtable p = JsonConvert.DeserializeObject(value, typeof(TypedSubHashtable)) as TypedSubHashtable;
212 Assert.AreEqual("01/24/2010 12:00:00", p.Hash["ExpiryDate"].ToString());
214 ""01/24/2010 12:00:00""
215 ]", p.Hash["UntypedArray"].ToString());
220 public void SerializeDeserializeGetOnlyProperty()
222 string value = JsonConvert.SerializeObject(new GetOnlyPropertyClass());
224 GetOnlyPropertyClass c = JsonConvert.DeserializeObject<GetOnlyPropertyClass>(value);
226 Assert.AreEqual(c.Field, "Field");
227 Assert.AreEqual(c.GetOnlyProperty, "GetOnlyProperty");
231 public void SerializeDeserializeSetOnlyProperty()
233 string value = JsonConvert.SerializeObject(new SetOnlyPropertyClass());
235 SetOnlyPropertyClass c = JsonConvert.DeserializeObject<SetOnlyPropertyClass>(value);
237 Assert.AreEqual(c.Field, "Field");
241 public void JsonIgnoreAttributeTest()
243 string json = JsonConvert.SerializeObject(new JsonIgnoreAttributeTestClass());
245 Assert.AreEqual(@"{""Field"":0,""Property"":21}", json);
247 JsonIgnoreAttributeTestClass c = JsonConvert.DeserializeObject<JsonIgnoreAttributeTestClass>(@"{""Field"":99,""Property"":-1,""IgnoredField"":-1,""IgnoredObject"":[1,2,3,4,5]}");
249 Assert.AreEqual(0, c.IgnoredField);
250 Assert.AreEqual(99, c.Field);
254 public void GoogleSearchAPI()
260 GsearchResultClass:""GwebSearch"",
261 unescapedUrl : ""http://www.google.com/"",
262 url : ""http://www.google.com/"",
263 visibleUrl : ""www.google.com"",
265 ""http://www.google.com/search?q=cache:zhool8dxBV4J:www.google.com"",
267 titleNoFormatting : ""Google"",
268 content : ""Enables users to search the Web, Usenet, and
269 images. Features include PageRank, caching and translation of
270 results, and an option to find similar pages.""
273 GsearchResultClass:""GwebSearch"",
274 unescapedUrl : ""http://news.google.com/"",
275 url : ""http://news.google.com/"",
276 visibleUrl : ""news.google.com"",
278 ""http://www.google.com/search?q=cache:Va_XShOz_twJ:news.google.com"",
279 title : ""Google News"",
280 titleNoFormatting : ""Google News"",
281 content : ""Aggregated headlines and a search engine of many of the world's news sources.""
285 GsearchResultClass:""GwebSearch"",
286 unescapedUrl : ""http://groups.google.com/"",
287 url : ""http://groups.google.com/"",
288 visibleUrl : ""groups.google.com"",
290 ""http://www.google.com/search?q=cache:x2uPD3hfkn0J:groups.google.com"",
291 title : ""Google Groups"",
292 titleNoFormatting : ""Google Groups"",
293 content : ""Enables users to search and browse the Usenet
294 archives which consist of over 700 million messages, and post new
299 GsearchResultClass:""GwebSearch"",
300 unescapedUrl : ""http://maps.google.com/"",
301 url : ""http://maps.google.com/"",
302 visibleUrl : ""maps.google.com"",
304 ""http://www.google.com/search?q=cache:dkf5u2twBXIJ:maps.google.com"",
305 title : ""Google Maps"",
306 titleNoFormatting : ""Google Maps"",
307 content : ""Provides directions, interactive maps, and
308 satellite/aerial imagery of the United States. Can also search by
309 keyword such as type of business.""
316 GsearchResultClass:""GwebSearch.ad"",
317 title : ""Gartner Symposium/ITxpo"",
318 content1 : ""Meet brilliant Gartner IT analysts"",
319 content2 : ""20-23 May 2007- Barcelona, Spain"",
321 ""http://www.google.com/url?sa=L&ai=BVualExYGRo3hD5ianAPJvejjD8-s6ye7kdTwArbI4gTAlrECEAEYASDXtMMFOAFQubWAjvr_____AWDXw_4EiAEBmAEAyAEBgAIB&num=1&q=http://www.gartner.com/it/sym/2007/spr8/spr8.jsp%3Fsrc%3D_spain_07_%26WT.srch%3D1&usg=__CxRH06E4Xvm9Muq13S4MgMtnziY="",
324 ""http://www.google.com/uds/css/ad-indicator-on.gif?ai=BVualExYGRo3hD5ianAPJvejjD8-s6ye7kdTwArbI4gTAlrECEAEYASDXtMMFOAFQubWAjvr_____AWDXw_4EiAEBmAEAyAEBgAIB"",
327 ""http://www.google.com/url?sa=L&ai=BVualExYGRo3hD5ianAPJvejjD8-s6ye7kdTwArbI4gTAlrECEAEYASDXtMMFOAFQubWAjvr_____AWDXw_4EiAEBmAEAyAEBgAIB&num=1&q=http://www.gartner.com/it/sym/2007/spr8/spr8.jsp%3Fsrc%3D_spain_07_%26WT.srch%3D1&usg=__CxRH06E4Xvm9Muq13S4MgMtnziY="",
329 visibleUrl : ""www.gartner.com""
334 object o = JsonConvert.DeserializeObject(json);
335 string s = string.Empty;
340 public void TorrentDeserializeTest()
342 string jsonText = @"{
348 [""192D99A5C943555CB7F00A852821CF6D6DB3008A"",201,""filename.avi"",178311826,1000,178311826,72815250,408,1603,7,121430,""NameOfLabelPrevioslyDefined"",3,6,0,8,128954,-1,0],
350 ""torrentc"": ""1816000723""
353 JObject o = (JObject)JsonConvert.DeserializeObject(jsonText);
354 Assert.AreEqual(4, o.Children().Count());
356 JToken torrentsArray = (JToken)o["torrents"];
357 JToken nestedTorrentsArray = (JToken)torrentsArray[0];
358 Assert.AreEqual(nestedTorrentsArray.Children().Count(), 19);
362 public void JsonPropertyClassSerialize()
364 JsonPropertyClass test = new JsonPropertyClass();
365 test.Pie = "Delicious";
366 test.SweetCakesCount = int.MaxValue;
368 string jsonText = JsonConvert.SerializeObject(test);
370 Assert.AreEqual(@"{""pie"":""Delicious"",""pie1"":""PieChart!"",""sweet_cakes_count"":2147483647}", jsonText);
372 JsonPropertyClass test2 = JsonConvert.DeserializeObject<JsonPropertyClass>(jsonText);
374 Assert.AreEqual(test.Pie, test2.Pie);
375 Assert.AreEqual(test.SweetCakesCount, test2.SweetCakesCount);
379 [ExpectedException(typeof(JsonSerializationException), ExpectedMessage = @"A member with the name 'pie' already exists on 'Newtonsoft.Json.Tests.TestObjects.BadJsonPropertyClass'. Use the JsonPropertyAttribute to specify another name.")]
380 public void BadJsonPropertyClassSerialize()
382 JsonConvert.SerializeObject(new BadJsonPropertyClass());
386 public void InheritedListSerialize()
388 Article a1 = new Article("a1");
389 Article a2 = new Article("a2");
391 ArticleCollection articles1 = new ArticleCollection();
395 string jsonText = JsonConvert.SerializeObject(articles1);
397 ArticleCollection articles2 = JsonConvert.DeserializeObject<ArticleCollection>(jsonText);
399 Assert.AreEqual(articles1.Count, articles2.Count);
400 Assert.AreEqual(articles1[0].Name, articles2[0].Name);
404 public void ReadOnlyCollectionSerialize()
406 ReadOnlyCollection<int> r1 = new ReadOnlyCollection<int>(new int[] { 0, 1, 2, 3, 4 });
408 string jsonText = JsonConvert.SerializeObject(r1);
410 ReadOnlyCollection<int> r2 = JsonConvert.DeserializeObject<ReadOnlyCollection<int>>(jsonText);
412 CollectionAssert.AreEqual(r1, r2);
415 #if !PocketPC && !NET20 && !WINDOWS_PHONE
417 public void Unicode()
419 string json = @"[""PRE\u003cPOST""]";
421 DataContractJsonSerializer s = new DataContractJsonSerializer(typeof(List<string>));
422 List<string> dataContractResult = (List<string>)s.ReadObject(new MemoryStream(Encoding.UTF8.GetBytes(json)));
424 List<string> jsonNetResult = JsonConvert.DeserializeObject<List<string>>(json);
426 Assert.AreEqual(1, jsonNetResult.Count);
427 Assert.AreEqual(dataContractResult[0], jsonNetResult[0]);
431 public void BackslashEqivilence()
433 string json = @"[""vvv\/vvv\tvvv\""vvv\bvvv\nvvv\rvvv\\vvv\fvvv""]";
436 JavaScriptSerializer javaScriptSerializer = new JavaScriptSerializer();
437 List<string> javaScriptSerializerResult = javaScriptSerializer.Deserialize<List<string>>(json);
440 DataContractJsonSerializer s = new DataContractJsonSerializer(typeof(List<string>));
441 List<string> dataContractResult = (List<string>)s.ReadObject(new MemoryStream(Encoding.UTF8.GetBytes(json)));
443 List<string> jsonNetResult = JsonConvert.DeserializeObject<List<string>>(json);
445 Assert.AreEqual(1, jsonNetResult.Count);
446 Assert.AreEqual(dataContractResult[0], jsonNetResult[0]);
448 Assert.AreEqual(javaScriptSerializerResult[0], jsonNetResult[0]);
453 [ExpectedException(typeof(JsonReaderException), ExpectedMessage = @"Bad JSON escape sequence: \j. Line 1, position 7.")]
454 public void InvalidBackslash()
456 string json = @"[""vvv\jvvv""]";
458 JsonConvert.DeserializeObject<List<string>>(json);
462 public void DateTimeTest()
464 List<DateTime> testDates = new List<DateTime> {
465 new DateTime(100, 1, 1, 1, 1, 1, DateTimeKind.Local),
466 new DateTime(100, 1, 1, 1, 1, 1, DateTimeKind.Unspecified),
467 new DateTime(100, 1, 1, 1, 1, 1, DateTimeKind.Utc),
468 new DateTime(2000, 1, 1, 1, 1, 1, DateTimeKind.Local),
469 new DateTime(2000, 1, 1, 1, 1, 1, DateTimeKind.Unspecified),
470 new DateTime(2000, 1, 1, 1, 1, 1, DateTimeKind.Utc),
475 MemoryStream ms = new MemoryStream();
476 DataContractJsonSerializer s = new DataContractJsonSerializer(typeof(List<DateTime>));
477 s.WriteObject(ms, testDates);
478 ms.Seek(0, SeekOrigin.Begin);
479 StreamReader sr = new StreamReader(ms);
481 string expected = sr.ReadToEnd();
483 result = JsonConvert.SerializeObject(testDates);
484 Assert.AreEqual(expected, result);
488 public void DateTimeOffset()
490 List<DateTimeOffset> testDates = new List<DateTimeOffset> {
491 new DateTimeOffset(new DateTime(100, 1, 1, 1, 1, 1, DateTimeKind.Utc)),
492 new DateTimeOffset(2000, 1, 1, 1, 1, 1, TimeSpan.Zero),
493 new DateTimeOffset(2000, 1, 1, 1, 1, 1, TimeSpan.FromHours(13)),
494 new DateTimeOffset(2000, 1, 1, 1, 1, 1, TimeSpan.FromHours(-3.5)),
497 string result = JsonConvert.SerializeObject(testDates);
498 Assert.AreEqual(@"[""\/Date(-59011455539000+0000)\/"",""\/Date(946688461000+0000)\/"",""\/Date(946641661000+1300)\/"",""\/Date(946701061000-0330)\/""]", result);
503 public void NonStringKeyDictionary()
505 Dictionary<int, int> values = new Dictionary<int, int>();
507 values.Add(int.MinValue, int.MaxValue);
509 string json = JsonConvert.SerializeObject(values);
511 Assert.AreEqual(@"{""-5"":6,""-2147483648"":2147483647}", json);
513 Dictionary<int, int> newValues = JsonConvert.DeserializeObject<Dictionary<int, int>>(json);
515 CollectionAssert.AreEqual(values, newValues);
519 public void AnonymousObjectSerialization()
524 StringValue = "I am a string",
525 IntValue = int.MaxValue,
526 NestedAnonymous = new { NestedValue = byte.MaxValue },
527 NestedArray = new[] { 1, 2 },
528 Product = new Product() { Name = "TestProduct" }
531 string json = JsonConvert.SerializeObject(anonymous);
532 Assert.AreEqual(@"{""StringValue"":""I am a string"",""IntValue"":2147483647,""NestedAnonymous"":{""NestedValue"":255},""NestedArray"":[1,2],""Product"":{""Name"":""TestProduct"",""ExpiryDate"":""\/Date(946684800000)\/"",""Price"":0.0,""Sizes"":null}}", json);
534 anonymous = JsonConvert.DeserializeAnonymousType(json, anonymous);
535 Assert.AreEqual("I am a string", anonymous.StringValue);
536 Assert.AreEqual(int.MaxValue, anonymous.IntValue);
537 Assert.AreEqual(255, anonymous.NestedAnonymous.NestedValue);
538 Assert.AreEqual(2, anonymous.NestedArray.Length);
539 Assert.AreEqual(1, anonymous.NestedArray[0]);
540 Assert.AreEqual(2, anonymous.NestedArray[1]);
541 Assert.AreEqual("TestProduct", anonymous.Product.Name);
545 public void CustomCollectionSerialization()
547 ProductCollection collection = new ProductCollection()
549 new Product() { Name = "Test1" },
550 new Product() { Name = "Test2" },
551 new Product() { Name = "Test3" }
554 JsonSerializer jsonSerializer = new JsonSerializer();
555 jsonSerializer.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
557 StringWriter sw = new StringWriter();
559 jsonSerializer.Serialize(sw, collection);
561 Assert.AreEqual(@"[{""Name"":""Test1"",""ExpiryDate"":""\/Date(946684800000)\/"",""Price"":0.0,""Sizes"":null},{""Name"":""Test2"",""ExpiryDate"":""\/Date(946684800000)\/"",""Price"":0.0,""Sizes"":null},{""Name"":""Test3"",""ExpiryDate"":""\/Date(946684800000)\/"",""Price"":0.0,""Sizes"":null}]",
562 sw.GetStringBuilder().ToString());
564 ProductCollection collectionNew = (ProductCollection)jsonSerializer.Deserialize(new JsonTextReader(new StringReader(sw.GetStringBuilder().ToString())), typeof(ProductCollection));
566 CollectionAssert.AreEqual(collection, collectionNew);
570 public void SerializeObject()
572 string json = JsonConvert.SerializeObject(new object());
573 Assert.AreEqual("{}", json);
577 public void SerializeNull()
579 string json = JsonConvert.SerializeObject(null);
580 Assert.AreEqual("null", json);
584 public void CanDeserializeIntArrayWhenNotFirstPropertyInJson()
586 string json = "{foo:'hello',bar:[1,2,3]}";
587 ClassWithArray wibble = JsonConvert.DeserializeObject<ClassWithArray>(json);
588 Assert.AreEqual("hello", wibble.Foo);
590 Assert.AreEqual(4, wibble.Bar.Count);
591 Assert.AreEqual(int.MaxValue, wibble.Bar[0]);
592 Assert.AreEqual(1, wibble.Bar[1]);
593 Assert.AreEqual(2, wibble.Bar[2]);
594 Assert.AreEqual(3, wibble.Bar[3]);
598 public void CanDeserializeIntArray_WhenArrayIsFirstPropertyInJson()
600 string json = "{bar:[1,2,3], foo:'hello'}";
601 ClassWithArray wibble = JsonConvert.DeserializeObject<ClassWithArray>(json);
602 Assert.AreEqual("hello", wibble.Foo);
604 Assert.AreEqual(4, wibble.Bar.Count);
605 Assert.AreEqual(int.MaxValue, wibble.Bar[0]);
606 Assert.AreEqual(1, wibble.Bar[1]);
607 Assert.AreEqual(2, wibble.Bar[2]);
608 Assert.AreEqual(3, wibble.Bar[3]);
612 public void ObjectCreationHandlingReplace()
614 string json = "{bar:[1,2,3], foo:'hello'}";
616 JsonSerializer s = new JsonSerializer();
617 s.ObjectCreationHandling = ObjectCreationHandling.Replace;
619 ClassWithArray wibble = (ClassWithArray)s.Deserialize(new StringReader(json), typeof(ClassWithArray));
621 Assert.AreEqual("hello", wibble.Foo);
623 Assert.AreEqual(1, wibble.Bar.Count);
627 public void CanDeserializeSerializedJson()
629 ClassWithArray wibble = new ClassWithArray();
630 wibble.Foo = "hello";
634 string json = JsonConvert.SerializeObject(wibble);
636 ClassWithArray wibbleOut = JsonConvert.DeserializeObject<ClassWithArray>(json);
637 Assert.AreEqual("hello", wibbleOut.Foo);
639 Assert.AreEqual(5, wibbleOut.Bar.Count);
640 Assert.AreEqual(int.MaxValue, wibbleOut.Bar[0]);
641 Assert.AreEqual(int.MaxValue, wibbleOut.Bar[1]);
642 Assert.AreEqual(1, wibbleOut.Bar[2]);
643 Assert.AreEqual(2, wibbleOut.Bar[3]);
644 Assert.AreEqual(3, wibbleOut.Bar[4]);
648 public void SerializeConverableObjects()
650 string json = JsonConvert.SerializeObject(new ConverableMembers());
652 Assert.AreEqual(@"{""String"":""string"",""Int32"":2147483647,""UInt32"":4294967295,""Byte"":255,""SByte"":127,""Short"":32767,""UShort"":65535,""Long"":9223372036854775807,""ULong"":9223372036854775807,""Double"":1.7976931348623157E+308,""Float"":3.40282347E+38,""DBNull"":null,""Bool"":true,""Char"":""\u0000""}", json);
654 ConverableMembers c = JsonConvert.DeserializeObject<ConverableMembers>(json);
655 Assert.AreEqual("string", c.String);
656 Assert.AreEqual(double.MaxValue, c.Double);
657 Assert.AreEqual(DBNull.Value, c.DBNull);
661 public void SerializeStack()
663 Stack<object> s = new Stack<object>();
668 string json = JsonConvert.SerializeObject(s);
669 Assert.AreEqual("[3,2,1]", json);
673 public void GuidTest()
675 Guid guid = new Guid("BED7F4EA-1A96-11d2-8F08-00A0C9A6186D");
677 string json = JsonConvert.SerializeObject(new ClassWithGuid { GuidField = guid });
678 Assert.AreEqual(@"{""GuidField"":""bed7f4ea-1a96-11d2-8f08-00a0c9a6186d""}", json);
680 ClassWithGuid c = JsonConvert.DeserializeObject<ClassWithGuid>(json);
681 Assert.AreEqual(guid, c.GuidField);
685 public void EnumTest()
687 string json = JsonConvert.SerializeObject(StringComparison.CurrentCultureIgnoreCase);
688 Assert.AreEqual(@"1", json);
690 StringComparison s = JsonConvert.DeserializeObject<StringComparison>(json);
691 Assert.AreEqual(StringComparison.CurrentCultureIgnoreCase, s);
694 public class ClassWithTimeSpan
696 public TimeSpan TimeSpanField;
700 public void TimeSpanTest()
702 TimeSpan ts = new TimeSpan(00, 23, 59, 1);
704 string json = JsonConvert.SerializeObject(new ClassWithTimeSpan { TimeSpanField = ts }, Formatting.Indented);
706 ""TimeSpanField"": ""23:59:01""
709 ClassWithTimeSpan c = JsonConvert.DeserializeObject<ClassWithTimeSpan>(json);
710 Assert.AreEqual(ts, c.TimeSpanField);
714 public void JsonIgnoreAttributeOnClassTest()
716 string json = JsonConvert.SerializeObject(new JsonIgnoreAttributeOnClassTestClass());
718 Assert.AreEqual(@"{""TheField"":0,""Property"":21}", json);
720 JsonIgnoreAttributeOnClassTestClass c = JsonConvert.DeserializeObject<JsonIgnoreAttributeOnClassTestClass>(@"{""TheField"":99,""Property"":-1,""IgnoredField"":-1}");
722 Assert.AreEqual(0, c.IgnoredField);
723 Assert.AreEqual(99, c.Field);
728 public void SerializeArrayAsArrayList()
730 string jsonText = @"[3, ""somestring"",[1,2,3],{}]";
731 ArrayList o = JsonConvert.DeserializeObject<ArrayList>(jsonText);
733 Assert.AreEqual(4, o.Count);
734 Assert.AreEqual(3, ((JArray)o[2]).Count);
735 Assert.AreEqual(0, ((JObject)o[3]).Count);
740 public void SerializeMemberGenericList()
742 Name name = new Name("The Idiot in Next To Me");
744 PhoneNumber p1 = new PhoneNumber("555-1212");
745 PhoneNumber p2 = new PhoneNumber("444-1212");
747 name.pNumbers.Add(p1);
748 name.pNumbers.Add(p2);
750 string json = JsonConvert.SerializeObject(name, Formatting.Indented);
753 ""personsName"": ""The Idiot in Next To Me"",
756 ""phoneNumber"": ""555-1212""
759 ""phoneNumber"": ""444-1212""
764 Name newName = JsonConvert.DeserializeObject<Name>(json);
766 Assert.AreEqual("The Idiot in Next To Me", newName.personsName);
768 // not passed in as part of the constructor but assigned to pNumbers property
769 Assert.AreEqual(2, newName.pNumbers.Count);
770 Assert.AreEqual("555-1212", newName.pNumbers[0].phoneNumber);
771 Assert.AreEqual("444-1212", newName.pNumbers[1].phoneNumber);
775 public void ConstructorCaseSensitivity()
777 ConstructorCaseSensitivityClass c = new ConstructorCaseSensitivityClass("param1", "Param1", "Param2");
779 string json = JsonConvert.SerializeObject(c);
781 ConstructorCaseSensitivityClass deserialized = JsonConvert.DeserializeObject<ConstructorCaseSensitivityClass>(json);
783 Assert.AreEqual("param1", deserialized.param1);
784 Assert.AreEqual("Param1", deserialized.Param1);
785 Assert.AreEqual("Param2", deserialized.Param2);
789 public void SerializerShouldUseClassConverter()
791 ConverterPrecedenceClass c1 = new ConverterPrecedenceClass("!Test!");
793 string json = JsonConvert.SerializeObject(c1);
794 Assert.AreEqual(@"[""Class"",""!Test!""]", json);
796 ConverterPrecedenceClass c2 = JsonConvert.DeserializeObject<ConverterPrecedenceClass>(json);
798 Assert.AreEqual("!Test!", c2.TestValue);
802 public void SerializerShouldUseClassConverterOverArgumentConverter()
804 ConverterPrecedenceClass c1 = new ConverterPrecedenceClass("!Test!");
806 string json = JsonConvert.SerializeObject(c1, new ArgumentConverterPrecedenceClassConverter());
807 Assert.AreEqual(@"[""Class"",""!Test!""]", json);
809 ConverterPrecedenceClass c2 = JsonConvert.DeserializeObject<ConverterPrecedenceClass>(json, new ArgumentConverterPrecedenceClassConverter());
811 Assert.AreEqual("!Test!", c2.TestValue);
815 public void SerializerShouldUseMemberConverter()
817 DateTime testDate = new DateTime(JsonConvert.InitialJavaScriptDateTicks, DateTimeKind.Utc);
818 MemberConverterClass m1 = new MemberConverterClass { DefaultConverter = testDate, MemberConverter = testDate };
820 string json = JsonConvert.SerializeObject(m1);
821 Assert.AreEqual(@"{""DefaultConverter"":""\/Date(0)\/"",""MemberConverter"":""1970-01-01T00:00:00Z""}", json);
823 MemberConverterClass m2 = JsonConvert.DeserializeObject<MemberConverterClass>(json);
825 Assert.AreEqual(testDate, m2.DefaultConverter);
826 Assert.AreEqual(testDate, m2.MemberConverter);
830 public void SerializerShouldUseMemberConverterOverArgumentConverter()
832 DateTime testDate = new DateTime(JsonConvert.InitialJavaScriptDateTicks, DateTimeKind.Utc);
833 MemberConverterClass m1 = new MemberConverterClass { DefaultConverter = testDate, MemberConverter = testDate };
835 string json = JsonConvert.SerializeObject(m1, new JavaScriptDateTimeConverter());
836 Assert.AreEqual(@"{""DefaultConverter"":new Date(0),""MemberConverter"":""1970-01-01T00:00:00Z""}", json);
838 MemberConverterClass m2 = JsonConvert.DeserializeObject<MemberConverterClass>(json, new JavaScriptDateTimeConverter());
840 Assert.AreEqual(testDate, m2.DefaultConverter);
841 Assert.AreEqual(testDate, m2.MemberConverter);
845 public void ConverterAttributeExample()
847 DateTime date = Convert.ToDateTime("1970-01-01T00:00:00Z").ToUniversalTime();
849 MemberConverterClass c = new MemberConverterClass
851 DefaultConverter = date,
852 MemberConverter = date
855 string json = JsonConvert.SerializeObject(c, Formatting.Indented);
857 Console.WriteLine(json);
859 // "DefaultConverter": "\/Date(0)\/",
860 // "MemberConverter": "1970-01-01T00:00:00Z"
865 public void SerializerShouldUseMemberConverterOverClassAndArgumentConverter()
867 ClassAndMemberConverterClass c1 = new ClassAndMemberConverterClass();
868 c1.DefaultConverter = new ConverterPrecedenceClass("DefaultConverterValue");
869 c1.MemberConverter = new ConverterPrecedenceClass("MemberConverterValue");
871 string json = JsonConvert.SerializeObject(c1, new ArgumentConverterPrecedenceClassConverter());
872 Assert.AreEqual(@"{""DefaultConverter"":[""Class"",""DefaultConverterValue""],""MemberConverter"":[""Member"",""MemberConverterValue""]}", json);
874 ClassAndMemberConverterClass c2 = JsonConvert.DeserializeObject<ClassAndMemberConverterClass>(json, new ArgumentConverterPrecedenceClassConverter());
876 Assert.AreEqual("DefaultConverterValue", c2.DefaultConverter.TestValue);
877 Assert.AreEqual("MemberConverterValue", c2.MemberConverter.TestValue);
881 [ExpectedException(typeof(JsonSerializationException), ExpectedMessage = "JsonConverter IsoDateTimeConverter on Newtonsoft.Json.Tests.TestObjects.IncompatibleJsonAttributeClass is not compatible with member type IncompatibleJsonAttributeClass.")]
882 public void IncompatibleJsonAttributeShouldThrow()
884 IncompatibleJsonAttributeClass c = new IncompatibleJsonAttributeClass();
885 JsonConvert.SerializeObject(c);
889 public void GenericAbstractProperty()
891 string json = JsonConvert.SerializeObject(new GenericImpl());
892 Assert.AreEqual(@"{""Id"":0}", json);
896 public void DeserializeNullable()
900 json = JsonConvert.SerializeObject((int?)null);
901 Assert.AreEqual("null", json);
903 json = JsonConvert.SerializeObject((int?)1);
904 Assert.AreEqual("1", json);
908 public void SerializeJsonRaw()
910 PersonRaw personRaw = new PersonRaw
912 FirstName = "FirstNameValue",
913 RawContent = new JRaw("[1,2,3,4,5]"),
914 LastName = "LastNameValue"
919 json = JsonConvert.SerializeObject(personRaw);
920 Assert.AreEqual(@"{""first_name"":""FirstNameValue"",""RawContent"":[1,2,3,4,5],""last_name"":""LastNameValue""}", json);
924 public void DeserializeJsonRaw()
926 string json = @"{""first_name"":""FirstNameValue"",""RawContent"":[1,2,3,4,5],""last_name"":""LastNameValue""}";
928 PersonRaw personRaw = JsonConvert.DeserializeObject<PersonRaw>(json);
930 Assert.AreEqual("FirstNameValue", personRaw.FirstName);
931 Assert.AreEqual("[1,2,3,4,5]", personRaw.RawContent.ToString());
932 Assert.AreEqual("LastNameValue", personRaw.LastName);
937 public void DeserializeNullableMember()
939 UserNullable userNullablle = new UserNullable
941 Id = new Guid("AD6205E8-0DF4-465d-AEA6-8BA18E93A7E7"),
942 FName = "FirstValue",
950 string json = JsonConvert.SerializeObject(userNullablle);
952 Assert.AreEqual(@"{""Id"":""ad6205e8-0df4-465d-aea6-8ba18e93a7e7"",""FName"":""FirstValue"",""LName"":""LastValue"",""RoleId"":5,""NullableRoleId"":6,""NullRoleId"":null,""Active"":true}", json);
954 UserNullable userNullablleDeserialized = JsonConvert.DeserializeObject<UserNullable>(json);
956 Assert.AreEqual(new Guid("AD6205E8-0DF4-465d-AEA6-8BA18E93A7E7"), userNullablleDeserialized.Id);
957 Assert.AreEqual("FirstValue", userNullablleDeserialized.FName);
958 Assert.AreEqual("LastValue", userNullablleDeserialized.LName);
959 Assert.AreEqual(5, userNullablleDeserialized.RoleId);
960 Assert.AreEqual(6, userNullablleDeserialized.NullableRoleId);
961 Assert.AreEqual(null, userNullablleDeserialized.NullRoleId);
962 Assert.AreEqual(true, userNullablleDeserialized.Active);
966 public void DeserializeInt64ToNullableDouble()
968 string json = @"{""Height"":1}";
970 DoubleClass c = JsonConvert.DeserializeObject<DoubleClass>(json);
971 Assert.AreEqual(1, c.Height);
975 public void SerializeTypeProperty()
977 string boolRef = typeof(bool).AssemblyQualifiedName;
978 TypeClass typeClass = new TypeClass { TypeProperty = typeof(bool) };
980 string json = JsonConvert.SerializeObject(typeClass);
981 Assert.AreEqual(@"{""TypeProperty"":""" + boolRef + @"""}", json);
983 TypeClass typeClass2 = JsonConvert.DeserializeObject<TypeClass>(json);
984 Assert.AreEqual(typeof(bool), typeClass2.TypeProperty);
986 string jsonSerializerTestRef = typeof(JsonSerializerTest).AssemblyQualifiedName;
987 typeClass = new TypeClass { TypeProperty = typeof(JsonSerializerTest) };
989 json = JsonConvert.SerializeObject(typeClass);
990 Assert.AreEqual(@"{""TypeProperty"":""" + jsonSerializerTestRef + @"""}", json);
992 typeClass2 = JsonConvert.DeserializeObject<TypeClass>(json);
993 Assert.AreEqual(typeof(JsonSerializerTest), typeClass2.TypeProperty);
997 public void RequiredMembersClass()
999 RequiredMembersClass c = new RequiredMembersClass()
1001 BirthDate = new DateTime(2000, 12, 20, 10, 55, 55, DateTimeKind.Utc),
1004 MiddleName = "Cosmo"
1007 string json = JsonConvert.SerializeObject(c, Formatting.Indented);
1010 ""FirstName"": ""Bob"",
1011 ""MiddleName"": ""Cosmo"",
1012 ""LastName"": ""Smith"",
1013 ""BirthDate"": ""\/Date(977309755000)\/""
1016 RequiredMembersClass c2 = JsonConvert.DeserializeObject<RequiredMembersClass>(json);
1018 Assert.AreEqual("Bob", c2.FirstName);
1019 Assert.AreEqual(new DateTime(2000, 12, 20, 10, 55, 55, DateTimeKind.Utc), c2.BirthDate);
1023 public void DeserializeRequiredMembersClassWithNullValues()
1026 ""FirstName"": ""I can't be null bro!"",
1027 ""MiddleName"": null,
1029 ""BirthDate"": ""\/Date(977309755000)\/""
1032 RequiredMembersClass c = JsonConvert.DeserializeObject<RequiredMembersClass>(json);
1034 Assert.AreEqual("I can't be null bro!", c.FirstName);
1035 Assert.AreEqual(null, c.MiddleName);
1036 Assert.AreEqual(null, c.LastName);
1040 [ExpectedException(typeof(JsonSerializationException), ExpectedMessage = "Required property 'FirstName' expects a value but got null.")]
1041 public void DeserializeRequiredMembersClassNullRequiredValueProperty()
1044 ""FirstName"": null,
1045 ""MiddleName"": null,
1047 ""BirthDate"": ""\/Date(977309755000)\/""
1050 JsonConvert.DeserializeObject<RequiredMembersClass>(json);
1054 [ExpectedException(typeof(JsonSerializationException), ExpectedMessage = "Cannot write a null value for property 'FirstName'. Property requires a value.")]
1055 public void SerializeRequiredMembersClassNullRequiredValueProperty()
1057 RequiredMembersClass requiredMembersClass = new RequiredMembersClass
1060 BirthDate = new DateTime(2000, 10, 10, 10, 10, 10, DateTimeKind.Utc),
1065 string json = JsonConvert.SerializeObject(requiredMembersClass);
1066 Console.WriteLine(json);
1070 [ExpectedException(typeof(JsonSerializationException), ExpectedMessage = "Required property 'LastName' not found in JSON.")]
1071 public void RequiredMembersClassMissingRequiredProperty()
1074 ""FirstName"": ""Bob""
1077 JsonConvert.DeserializeObject<RequiredMembersClass>(json);
1081 public void SerializeJaggedArray()
1083 JaggedArray aa = new JaggedArray();
1084 aa.Before = "Before!";
1085 aa.After = "After!";
1086 aa.Coordinates = new[] { new[] { 1, 1 }, new[] { 1, 2 }, new[] { 2, 1 }, new[] { 2, 2 } };
1088 string json = JsonConvert.SerializeObject(aa);
1090 Assert.AreEqual(@"{""Before"":""Before!"",""Coordinates"":[[1,1],[1,2],[2,1],[2,2]],""After"":""After!""}", json);
1094 public void DeserializeJaggedArray()
1096 string json = @"{""Before"":""Before!"",""Coordinates"":[[1,1],[1,2],[2,1],[2,2]],""After"":""After!""}";
1098 JaggedArray aa = JsonConvert.DeserializeObject<JaggedArray>(json);
1100 Assert.AreEqual("Before!", aa.Before);
1101 Assert.AreEqual("After!", aa.After);
1102 Assert.AreEqual(4, aa.Coordinates.Length);
1103 Assert.AreEqual(2, aa.Coordinates[0].Length);
1104 Assert.AreEqual(1, aa.Coordinates[0][0]);
1105 Assert.AreEqual(2, aa.Coordinates[1][1]);
1107 string after = JsonConvert.SerializeObject(aa);
1109 Assert.AreEqual(json, after);
1113 public void DeserializeGoogleGeoCode()
1116 ""name"": ""1600 Amphitheatre Parkway, Mountain View, CA, USA"",
1119 ""request"": ""geocode""
1123 ""address"": ""1600 Amphitheatre Pkwy, Mountain View, CA 94043, USA"",
1124 ""AddressDetails"": {
1126 ""CountryNameCode"": ""US"",
1127 ""AdministrativeArea"": {
1128 ""AdministrativeAreaName"": ""CA"",
1129 ""SubAdministrativeArea"": {
1130 ""SubAdministrativeAreaName"": ""Santa Clara"",
1132 ""LocalityName"": ""Mountain View"",
1134 ""ThoroughfareName"": ""1600 Amphitheatre Pkwy""
1137 ""PostalCodeNumber"": ""94043""
1146 ""coordinates"": [-122.083739, 37.423021, 0]
1152 GoogleMapGeocoderStructure jsonGoogleMapGeocoder = JsonConvert.DeserializeObject<GoogleMapGeocoderStructure>(json);
1156 [ExpectedException(typeof(JsonSerializationException), ExpectedMessage = @"Could not create an instance of type Newtonsoft.Json.Tests.TestObjects.ICo. Type is an interface or abstract class and cannot be instantated.")]
1157 public void DeserializeInterfaceProperty()
1159 InterfacePropertyTestClass testClass = new InterfacePropertyTestClass();
1160 testClass.co = new Co();
1161 String strFromTest = JsonConvert.SerializeObject(testClass);
1162 InterfacePropertyTestClass testFromDe = (InterfacePropertyTestClass)JsonConvert.DeserializeObject(strFromTest, typeof(InterfacePropertyTestClass));
1165 private Person GetPerson()
1167 Person person = new Person
1169 Name = "Mike Manager",
1170 BirthDate = new DateTime(1983, 8, 3, 0, 0, 0, DateTimeKind.Utc),
1172 LastModified = new DateTime(2009, 2, 15, 0, 0, 0, DateTimeKind.Utc)
1178 public void WriteJsonToFile()
1180 //Person person = GetPerson();
1182 //string json = JsonConvert.SerializeObject(person, Formatting.Indented);
1184 //File.WriteAllText(@"c:\person.json", json);
1186 Person person = GetPerson();
1188 using (FileStream fs = System.IO.File.Open(@"c:\person.json", FileMode.CreateNew))
1189 using (StreamWriter sw = new StreamWriter(fs))
1190 using (JsonWriter jw = new JsonTextWriter(sw))
1192 jw.Formatting = Formatting.Indented;
1194 JsonSerializer serializer = new JsonSerializer();
1195 serializer.Serialize(jw, person);
1200 public void WriteJsonDates()
1202 LogEntry entry = new LogEntry
1204 LogDate = new DateTime(2009, 2, 15, 0, 0, 0, DateTimeKind.Utc),
1205 Details = "Application started."
1208 string defaultJson = JsonConvert.SerializeObject(entry);
1209 // {"Details":"Application started.","LogDate":"\/Date(1234656000000)\/"}
1211 string isoJson = JsonConvert.SerializeObject(entry, new IsoDateTimeConverter());
1212 // {"Details":"Application started.","LogDate":"2009-02-15T00:00:00.0000000Z"}
1214 string javascriptJson = JsonConvert.SerializeObject(entry, new JavaScriptDateTimeConverter());
1215 // {"Details":"Application started.","LogDate":new Date(1234656000000)}
1217 Console.WriteLine(defaultJson);
1218 Console.WriteLine(isoJson);
1219 Console.WriteLine(javascriptJson);
1222 public void GenericListAndDictionaryInterfaceProperties()
1224 GenericListAndDictionaryInterfaceProperties o = new GenericListAndDictionaryInterfaceProperties();
1225 o.IDictionaryProperty = new Dictionary<string, int>
1231 o.IListProperty = new List<int>
1235 o.IEnumerableProperty = new List<int>
1240 string json = JsonConvert.SerializeObject(o, Formatting.Indented);
1243 ""IEnumerableProperty"": [
1248 ""IListProperty"": [
1253 ""IDictionaryProperty"": {
1260 GenericListAndDictionaryInterfaceProperties deserializedObject = JsonConvert.DeserializeObject<GenericListAndDictionaryInterfaceProperties>(json);
1261 Assert.IsNotNull(deserializedObject);
1263 CollectionAssert.AreEqual(o.IListProperty.ToArray(), deserializedObject.IListProperty.ToArray());
1264 CollectionAssert.AreEqual(o.IEnumerableProperty.ToArray(), deserializedObject.IEnumerableProperty.ToArray());
1265 CollectionAssert.AreEqual(o.IDictionaryProperty.ToArray(), deserializedObject.IDictionaryProperty.ToArray());
1269 public void DeserializeBestMatchPropertyCase()
1272 ""firstName"": ""firstName"",
1273 ""FirstName"": ""FirstName"",
1274 ""LastName"": ""LastName"",
1275 ""lastName"": ""lastName"",
1278 PropertyCase o = JsonConvert.DeserializeObject<PropertyCase>(json);
1279 Assert.IsNotNull(o);
1281 Assert.AreEqual("firstName", o.firstName);
1282 Assert.AreEqual("FirstName", o.FirstName);
1283 Assert.AreEqual("LastName", o.LastName);
1284 Assert.AreEqual("lastName", o.lastName);
1288 public void DeserializePropertiesOnToNonDefaultConstructor()
1290 SubKlass i = new SubKlass("my subprop");
1291 i.SuperProp = "overrided superprop";
1293 string json = JsonConvert.SerializeObject(i);
1294 Assert.AreEqual(@"{""SubProp"":""my subprop"",""SuperProp"":""overrided superprop""}", json);
1296 SubKlass ii = JsonConvert.DeserializeObject<SubKlass>(json);
1298 string newJson = JsonConvert.SerializeObject(ii);
1299 Assert.AreEqual(@"{""SubProp"":""my subprop"",""SuperProp"":""overrided superprop""}", newJson);
1303 public void JsonPropertyWithHandlingValues()
1305 JsonPropertyWithHandlingValues o = new JsonPropertyWithHandlingValues();
1306 o.DefaultValueHandlingIgnoreProperty = "Default!";
1307 o.DefaultValueHandlingIncludeProperty = "Default!";
1309 string json = JsonConvert.SerializeObject(o, Formatting.Indented);
1312 ""DefaultValueHandlingIncludeProperty"": ""Default!"",
1313 ""NullValueHandlingIncludeProperty"": null,
1314 ""ReferenceLoopHandlingErrorProperty"": null,
1315 ""ReferenceLoopHandlingIgnoreProperty"": null,
1316 ""ReferenceLoopHandlingSerializeProperty"": null
1319 json = JsonConvert.SerializeObject(o, Formatting.Indented, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore });
1322 ""DefaultValueHandlingIncludeProperty"": ""Default!"",
1323 ""NullValueHandlingIncludeProperty"": null
1328 [ExpectedException(typeof(JsonSerializationException))]
1329 public void JsonPropertyWithHandlingValues_ReferenceLoopError()
1331 JsonPropertyWithHandlingValues o = new JsonPropertyWithHandlingValues();
1332 o.ReferenceLoopHandlingErrorProperty = o;
1334 JsonConvert.SerializeObject(o, Formatting.Indented, new JsonSerializerSettings { ReferenceLoopHandling = ReferenceLoopHandling.Ignore });
1338 public void PartialClassDeserialize()
1341 ""request"": ""ux.settings.update"",
1342 ""sid"": ""14c561bd-32a8-457e-b4e5-4bba0832897f"",
1343 ""uid"": ""30c39065-0f31-de11-9442-001e3786a8ec"",
1348 ""andytest_address"",
1354 ""entityName"": ""Andy Test"",
1355 ""setting"": ""entity.field.order""
1358 RequestOnly r = JsonConvert.DeserializeObject<RequestOnly>(json);
1359 Assert.AreEqual("ux.settings.update", r.Request);
1361 NonRequest n = JsonConvert.DeserializeObject<NonRequest>(json);
1362 Assert.AreEqual(new Guid("14c561bd-32a8-457e-b4e5-4bba0832897f"), n.Sid);
1363 Assert.AreEqual(new Guid("30c39065-0f31-de11-9442-001e3786a8ec"), n.Uid);
1364 Assert.AreEqual(8, n.FidOrder.Count);
1365 Assert.AreEqual("id", n.FidOrder[0]);
1366 Assert.AreEqual("titleId", n.FidOrder[n.FidOrder.Count - 1]);
1369 #if !SILVERLIGHT && !PocketPC && !NET20
1370 [MetadataType(typeof(OptInClassMetadata))]
1371 public class OptInClass
1374 public class OptInClassMetadata
1377 public string Name { get; set; }
1379 public int Age { get; set; }
1380 public string NotIncluded { get; set; }
1383 public string Name { get; set; }
1384 public int Age { get; set; }
1385 public string NotIncluded { get; set; }
1389 public void OptInClassMetadataSerialization()
1391 OptInClass optInClass = new OptInClass();
1392 optInClass.Age = 26;
1393 optInClass.Name = "James NK";
1394 optInClass.NotIncluded = "Poor me :(";
1396 string json = JsonConvert.SerializeObject(optInClass, Formatting.Indented);
1399 ""Name"": ""James NK"",
1403 OptInClass newOptInClass = JsonConvert.DeserializeObject<OptInClass>(@"{
1404 ""Name"": ""James NK"",
1405 ""NotIncluded"": ""Ignore me!"",
1408 Assert.AreEqual(26, newOptInClass.Age);
1409 Assert.AreEqual("James NK", newOptInClass.Name);
1410 Assert.AreEqual(null, newOptInClass.NotIncluded);
1414 #if !PocketPC && !NET20
1416 public class DataContractPrivateMembers
1418 public DataContractPrivateMembers()
1422 public DataContractPrivateMembers(string name, int age, int rank, string title)
1431 private string _name;
1432 [DataMember(Name = "_age")]
1433 private int Age { get; set; }
1435 private int Rank { get; set; }
1436 [JsonProperty(PropertyName = "JsonTitle")]
1437 [DataMember(Name = "DataTitle")]
1438 private string Title { get; set; }
1440 public string NotIncluded { get; set; }
1442 public override string ToString()
1444 return "_name: " + _name + ", _age: " + Age + ", Rank: " + Rank + ", JsonTitle: " + Title;
1449 public void SerializeDataContractPrivateMembers()
1451 DataContractPrivateMembers c = new DataContractPrivateMembers("Jeff", 26, 10, "Dr");
1452 c.NotIncluded = "Hi";
1453 string json = JsonConvert.SerializeObject(c, Formatting.Indented);
1456 ""_name"": ""Jeff"",
1459 ""JsonTitle"": ""Dr""
1462 DataContractPrivateMembers cc = JsonConvert.DeserializeObject<DataContractPrivateMembers>(json);
1463 Assert.AreEqual("_name: Jeff, _age: 26, Rank: 10, JsonTitle: Dr", cc.ToString());
1468 public void DeserializeDictionaryInterface()
1471 ""Name"": ""Name!"",
1477 DictionaryInterfaceClass c = JsonConvert.DeserializeObject<DictionaryInterfaceClass>(json,
1478 new JsonSerializerSettings { ObjectCreationHandling = ObjectCreationHandling.Replace });
1479 Assert.AreEqual("Name!", c.Name);
1480 Assert.AreEqual(1, c.Dictionary.Count);
1481 Assert.AreEqual(11, c.Dictionary["Item"]);
1485 public void DeserializeDictionaryInterfaceWithExistingValues()
1491 ""Name"": ""Name!"",
1501 ""Name"": ""ManagerName!""
1506 DictionaryInterfaceClass c = JsonConvert.DeserializeObject<DictionaryInterfaceClass>(json,
1507 new JsonSerializerSettings { ObjectCreationHandling = ObjectCreationHandling.Reuse });
1509 Assert.AreEqual("Name!", c.Name);
1510 Assert.AreEqual(3, c.Dictionary.Count);
1511 Assert.AreEqual(11, c.Dictionary["Item"]);
1512 Assert.AreEqual(1, c.Dictionary["existing"]);
1513 Assert.AreEqual(4, c.Collection.Count);
1514 Assert.AreEqual(1, c.Collection.ElementAt(0));
1515 Assert.AreEqual(999, c.Collection.ElementAt(3));
1516 Assert.AreEqual("EmployeeName!", c.Employee.Name);
1517 Assert.AreEqual("ManagerName!", c.Employee.Manager.Name);
1518 Assert.IsNotNull(c.Random);
1522 public void TypedObjectDeserializationWithComments()
1524 string json = @"/*comment*/ { /*comment*/
1525 ""Name"": /*comment*/ ""Apple"" /*comment*/, /*comment*/
1526 ""ExpiryDate"": ""\/Date(1230422400000)\/"",
1528 ""Sizes"": /*comment*/ [ /*comment*/
1529 ""Small"", /*comment*/
1530 ""Medium"" /*comment*/,
1531 /*comment*/ ""Large""
1532 /*comment*/ ] /*comment*/
1535 Product deserializedProduct = (Product)JsonConvert.DeserializeObject(json, typeof(Product));
1537 Assert.AreEqual("Apple", deserializedProduct.Name);
1538 Assert.AreEqual(new DateTime(2008, 12, 28, 0, 0, 0, DateTimeKind.Utc), deserializedProduct.ExpiryDate);
1539 Assert.AreEqual(3.99, deserializedProduct.Price);
1540 Assert.AreEqual("Small", deserializedProduct.Sizes[0]);
1541 Assert.AreEqual("Medium", deserializedProduct.Sizes[1]);
1542 Assert.AreEqual("Large", deserializedProduct.Sizes[2]);
1546 public void NestedInsideOuterObject()
1550 ""original"": ""http://www.contrast.ie/blog/online-marketing-2009/"",
1551 ""short"": ""m2sqc6"",
1552 ""shortened"": ""http://short.ie/m2sqc6"",
1555 ""msg"": ""No action taken""
1560 JObject o = JObject.Parse(json);
1562 Shortie s = JsonConvert.DeserializeObject<Shortie>(o["short"].ToString());
1563 Assert.IsNotNull(s);
1565 Assert.AreEqual(s.Original, "http://www.contrast.ie/blog/online-marketing-2009/");
1566 Assert.AreEqual(s.Short, "m2sqc6");
1567 Assert.AreEqual(s.Shortened, "http://short.ie/m2sqc6");
1571 public void UriSerialization()
1573 Uri uri = new Uri("http://codeplex.com");
1574 string json = JsonConvert.SerializeObject(uri);
1576 Assert.AreEqual("http://codeplex.com/", uri.ToString());
1578 Uri newUri = JsonConvert.DeserializeObject<Uri>(json);
1579 Assert.AreEqual(uri, newUri);
1583 public void AnonymousPlusLinqToSql()
1587 bar = new JObject(new JProperty("baz", 13))
1590 string json = JsonConvert.SerializeObject(value);
1592 Assert.AreEqual(@"{""bar"":{""baz"":13}}", json);
1596 public void SerializeEnumerableAsObject()
1598 Content content = new Content
1600 Text = "Blah, blah, blah",
1601 Children = new List<Content>
1603 new Content { Text = "First" },
1604 new Content { Text = "Second" }
1608 string json = JsonConvert.SerializeObject(content, Formatting.Indented);
1618 ""Text"": ""Second""
1621 ""Text"": ""Blah, blah, blah""
1626 public void DeserializeEnumerableAsObject()
1636 ""Text"": ""Second""
1639 ""Text"": ""Blah, blah, blah""
1642 Content content = JsonConvert.DeserializeObject<Content>(json);
1644 Assert.AreEqual("Blah, blah, blah", content.Text);
1645 Assert.AreEqual(2, content.Children.Count);
1646 Assert.AreEqual("First", content.Children[0].Text);
1647 Assert.AreEqual("Second", content.Children[1].Text);
1651 public void RoleTransferTest()
1653 string json = @"{""Operation"":""1"",""RoleName"":""Admin"",""Direction"":""0""}";
1655 RoleTransfer r = JsonConvert.DeserializeObject<RoleTransfer>(json);
1657 Assert.AreEqual(RoleTransferOperation.Second, r.Operation);
1658 Assert.AreEqual("Admin", r.RoleName);
1659 Assert.AreEqual(RoleTransferDirection.First, r.Direction);
1663 public void PrimitiveValuesInObjectArray()
1665 string json = @"{""action"":""Router"",""method"":""Navigate"",""data"":[""dashboard"",null],""type"":""rpc"",""tid"":2}";
1667 ObjectArrayPropertyTest o = JsonConvert.DeserializeObject<ObjectArrayPropertyTest>(json);
1669 Assert.AreEqual("Router", o.Action);
1670 Assert.AreEqual("Navigate", o.Method);
1671 Assert.AreEqual(2, o.Data.Length);
1672 Assert.AreEqual("dashboard", o.Data[0]);
1673 Assert.AreEqual(null, o.Data[1]);
1677 public void ComplexValuesInObjectArray()
1679 string json = @"{""action"":""Router"",""method"":""Navigate"",""data"":[""dashboard"",[""id"", 1, ""teststring"", ""test""],{""one"":1}],""type"":""rpc"",""tid"":2}";
1681 ObjectArrayPropertyTest o = JsonConvert.DeserializeObject<ObjectArrayPropertyTest>(json);
1683 Assert.AreEqual("Router", o.Action);
1684 Assert.AreEqual("Navigate", o.Method);
1685 Assert.AreEqual(3, o.Data.Length);
1686 Assert.AreEqual("dashboard", o.Data[0]);
1687 Assert.IsInstanceOfType(typeof(JArray), o.Data[1]);
1688 Assert.AreEqual(4, ((JArray)o.Data[1]).Count);
1689 Assert.IsInstanceOfType(typeof(JObject), o.Data[2]);
1690 Assert.AreEqual(1, ((JObject)o.Data[2]).Count);
1691 Assert.AreEqual(1, (int)((JObject)o.Data[2])["one"]);
1695 public void DeserializeGenericDictionary()
1697 string json = @"{""key1"":""value1"",""key2"":""value2""}";
1699 Dictionary<string, string> values = JsonConvert.DeserializeObject<Dictionary<string, string>>(json);
1701 Console.WriteLine(values.Count);
1704 Console.WriteLine(values["key1"]);
1707 Assert.AreEqual(2, values.Count);
1708 Assert.AreEqual("value1", values["key1"]);
1709 Assert.AreEqual("value2", values["key2"]);
1713 public void SerializeGenericList()
1715 Product p1 = new Product
1719 ExpiryDate = new DateTime(2000, 12, 29, 0, 0, 0, DateTimeKind.Utc),
1721 Product p2 = new Product
1725 ExpiryDate = new DateTime(2009, 7, 31, 0, 0, 0, DateTimeKind.Utc),
1728 List<Product> products = new List<Product>();
1732 string json = JsonConvert.SerializeObject(products, Formatting.Indented);
1735 // "Name": "Product 1",
1736 // "ExpiryDate": "\/Date(978048000000)\/",
1741 // "Name": "Product 2",
1742 // "ExpiryDate": "\/Date(1248998400000)\/",
1750 ""Name"": ""Product 1"",
1751 ""ExpiryDate"": ""\/Date(978048000000)\/"",
1756 ""Name"": ""Product 2"",
1757 ""ExpiryDate"": ""\/Date(1248998400000)\/"",
1765 public void DeserializeGenericList()
1769 ""Name"": ""Product 1"",
1770 ""ExpiryDate"": ""\/Date(978048000000)\/"",
1775 ""Name"": ""Product 2"",
1776 ""ExpiryDate"": ""\/Date(1248998400000)\/"",
1782 List<Product> products = JsonConvert.DeserializeObject<List<Product>>(json);
1784 Console.WriteLine(products.Count);
1787 Product p1 = products[0];
1789 Console.WriteLine(p1.Name);
1792 Assert.AreEqual(2, products.Count);
1793 Assert.AreEqual("Product 1", products[0].Name);
1796 #if !PocketPC && !NET20
1798 public void DeserializeEmptyStringToNullableDateTime()
1800 string json = @"{""DateTimeField"":""""}";
1802 NullableDateTimeTestClass c = JsonConvert.DeserializeObject<NullableDateTimeTestClass>(json);
1803 Assert.AreEqual(null, c.DateTimeField);
1808 [ExpectedException(typeof(JsonSerializationException), ExpectedMessage = @"Unable to find a constructor to use for type Newtonsoft.Json.Tests.TestObjects.Event. A class should either have a default constructor, one constructor with arguments or a constructor marked with the JsonConstructor attribute.")]
1809 public void FailWhenClassWithNoDefaultConstructorHasMultipleConstructorsWithArguments()
1811 string json = @"{""sublocation"":""AlertEmailSender.Program.Main"",""userId"":0,""type"":0,""summary"":""Loading settings variables"",""details"":null,""stackTrace"":"" at System.Environment.GetStackTrace(Exception e, Boolean needFileInfo)\r\n at System.Environment.get_StackTrace()\r\n at mr.Logging.Event..ctor(String summary) in C:\\Projects\\MRUtils\\Logging\\Event.vb:line 71\r\n at AlertEmailSender.Program.Main(String[] args) in C:\\Projects\\AlertEmailSender\\AlertEmailSender\\Program.cs:line 25"",""tag"":null,""time"":""\/Date(1249591032026-0400)\/""}";
1813 Event e = JsonConvert.DeserializeObject<Event>(json);
1817 public void DeserializeObjectSetOnlyProperty()
1819 string json = @"{'SetOnlyProperty':[1,2,3,4,5]}";
1821 SetOnlyPropertyClass2 setOnly = JsonConvert.DeserializeObject<SetOnlyPropertyClass2>(json);
1822 JArray a = (JArray)setOnly.GetValue();
1823 Assert.AreEqual(5, a.Count);
1824 Assert.AreEqual(1, (int)a[0]);
1825 Assert.AreEqual(5, (int)a[a.Count - 1]);
1829 public void DeserializeOptInClasses()
1831 string json = @"{id: ""12"", name: ""test"", items: [{id: ""112"", name: ""testing""}]}";
1833 ListTestClass l = JsonConvert.DeserializeObject<ListTestClass>(json);
1837 public void DeserializeNullableListWithNulls()
1839 List<decimal?> l = JsonConvert.DeserializeObject<List<decimal?>>("[ 3.3, null, 1.1 ] ");
1840 Assert.AreEqual(3, l.Count);
1842 Assert.AreEqual(3.3m, l[0]);
1843 Assert.AreEqual(null, l[1]);
1844 Assert.AreEqual(1.1m, l[2]);
1848 [ExpectedException(typeof(JsonSerializationException), ExpectedMessage = @"Cannot deserialize JSON array into type 'Newtonsoft.Json.Tests.TestObjects.Person'.")]
1849 public void CannotDeserializeArrayIntoObject()
1851 string json = @"[]";
1853 JsonConvert.DeserializeObject<Person>(json);
1857 [ExpectedException(typeof(JsonSerializationException), ExpectedMessage = @"Cannot deserialize JSON object into type 'System.Collections.Generic.List`1[Newtonsoft.Json.Tests.TestObjects.Person]'.")]
1858 public void CannotDeserializeObjectIntoArray()
1860 string json = @"{}";
1862 JsonConvert.DeserializeObject<List<Person>>(json);
1866 [ExpectedException(typeof(JsonSerializationException), ExpectedMessage = @"Cannot populate JSON array onto type 'Newtonsoft.Json.Tests.TestObjects.Person'.")]
1867 public void CannotPopulateArrayIntoObject()
1869 string json = @"[]";
1871 JsonConvert.PopulateObject(json, new Person());
1875 [ExpectedException(typeof(JsonSerializationException), ExpectedMessage = @"Cannot populate JSON object onto type 'System.Collections.Generic.List`1[Newtonsoft.Json.Tests.TestObjects.Person]'.")]
1876 public void CannotPopulateObjectIntoArray()
1878 string json = @"{}";
1880 JsonConvert.PopulateObject(json, new List<Person>());
1884 public void DeserializeEmptyString()
1886 string json = @"{""Name"":""""}";
1888 Person p = JsonConvert.DeserializeObject<Person>(json);
1889 Assert.AreEqual("", p.Name);
1893 [ExpectedException(typeof(JsonSerializationException), ExpectedMessage = @"Error getting value from 'ReadTimeout' on 'System.IO.MemoryStream'.")]
1894 public void SerializePropertyGetError()
1896 JsonConvert.SerializeObject(new MemoryStream());
1900 [ExpectedException(typeof(JsonSerializationException), ExpectedMessage = @"Error setting value to 'ReadTimeout' on 'System.IO.MemoryStream'.")]
1901 public void DeserializePropertySetError()
1903 JsonConvert.DeserializeObject<MemoryStream>("{ReadTimeout:0}");
1907 [ExpectedException(typeof(JsonSerializationException), ExpectedMessage = @"Error converting value """" to type 'System.Int32'.")]
1908 public void DeserializeEnsureTypeEmptyStringToIntError()
1910 JsonConvert.DeserializeObject<MemoryStream>("{ReadTimeout:''}");
1914 [ExpectedException(typeof(JsonSerializationException), ExpectedMessage = @"Error converting value {null} to type 'System.Int32'.")]
1915 public void DeserializeEnsureTypeNullToIntError()
1917 JsonConvert.DeserializeObject<MemoryStream>("{ReadTimeout:null}");
1921 public void SerializeGenericListOfStrings()
1923 List<String> strings = new List<String>();
1925 strings.Add("str_1");
1926 strings.Add("str_2");
1927 strings.Add("str_3");
1929 string json = JsonConvert.SerializeObject(strings);
1930 Assert.AreEqual(@"[""str_1"",""str_2"",""str_3""]", json);
1934 public void ConstructorReadonlyFieldsTest()
1936 ConstructorReadonlyFields c1 = new ConstructorReadonlyFields("String!", int.MaxValue);
1937 string json = JsonConvert.SerializeObject(c1, Formatting.Indented);
1943 ConstructorReadonlyFields c2 = JsonConvert.DeserializeObject<ConstructorReadonlyFields>(json);
1944 Assert.AreEqual("String!", c2.A);
1945 Assert.AreEqual(int.MaxValue, c2.B);
1949 public void SerializeStruct()
1951 StructTest structTest = new StructTest
1953 StringProperty = "StringProperty!",
1954 StringField = "StringField",
1959 string json = JsonConvert.SerializeObject(structTest, Formatting.Indented);
1960 Console.WriteLine(json);
1962 ""StringField"": ""StringField"",
1964 ""StringProperty"": ""StringProperty!"",
1968 StructTest deserialized = JsonConvert.DeserializeObject<StructTest>(json);
1969 Assert.AreEqual(structTest.StringProperty, deserialized.StringProperty);
1970 Assert.AreEqual(structTest.StringField, deserialized.StringField);
1971 Assert.AreEqual(structTest.IntProperty, deserialized.IntProperty);
1972 Assert.AreEqual(structTest.IntField, deserialized.IntField);
1976 public void SerializeListWithJsonConverter()
1979 f.Bars.Add(new Bar { Id = 0 });
1980 f.Bars.Add(new Bar { Id = 1 });
1981 f.Bars.Add(new Bar { Id = 2 });
1983 string json = JsonConvert.SerializeObject(f, Formatting.Indented);
1992 Foo newFoo = JsonConvert.DeserializeObject<Foo>(json);
1993 Assert.AreEqual(3, newFoo.Bars.Count);
1994 Assert.AreEqual(0, newFoo.Bars[0].Id);
1995 Assert.AreEqual(1, newFoo.Bars[1].Id);
1996 Assert.AreEqual(2, newFoo.Bars[2].Id);
2000 public void SerializeGuidKeyedDictionary()
2002 Dictionary<Guid, int> dictionary = new Dictionary<Guid, int>();
2003 dictionary.Add(new Guid("F60EAEE0-AE47-488E-B330-59527B742D77"), 1);
2004 dictionary.Add(new Guid("C2594C02-EBA1-426A-AA87-8DD8871350B0"), 2);
2006 string json = JsonConvert.SerializeObject(dictionary, Formatting.Indented);
2008 ""f60eaee0-ae47-488e-b330-59527b742d77"": 1,
2009 ""c2594c02-eba1-426a-aa87-8dd8871350b0"": 2
2014 public void SerializePersonKeyedDictionary()
2016 Dictionary<Person, int> dictionary = new Dictionary<Person, int>();
2017 dictionary.Add(new Person { Name = "p1" }, 1);
2018 dictionary.Add(new Person { Name = "p2" }, 2);
2020 string json = JsonConvert.SerializeObject(dictionary, Formatting.Indented);
2023 ""Newtonsoft.Json.Tests.TestObjects.Person"": 1,
2024 ""Newtonsoft.Json.Tests.TestObjects.Person"": 2
2029 [ExpectedException(typeof(JsonSerializationException), ExpectedMessage = "Could not convert string 'Newtonsoft.Json.Tests.TestObjects.Person' to dictionary key type 'Newtonsoft.Json.Tests.TestObjects.Person'. Create a TypeConverter to convert from the string to the key type object.")]
2030 public void DeserializePersonKeyedDictionary()
2034 ""Newtonsoft.Json.Tests.TestObjects.Person"": 1,
2035 ""Newtonsoft.Json.Tests.TestObjects.Person"": 2
2038 JsonConvert.DeserializeObject<Dictionary<Person, int>>(json);
2042 public void SerializeFragment()
2044 string googleSearchText = @"{
2048 ""GsearchResultClass"": ""GwebSearch"",
2049 ""unescapedUrl"": ""http://en.wikipedia.org/wiki/Paris_Hilton"",
2050 ""url"": ""http://en.wikipedia.org/wiki/Paris_Hilton"",
2051 ""visibleUrl"": ""en.wikipedia.org"",
2052 ""cacheUrl"": ""http://www.google.com/search?q=cache:TwrPfhd22hYJ:en.wikipedia.org"",
2053 ""title"": ""<b>Paris Hilton</b> - Wikipedia, the free encyclopedia"",
2054 ""titleNoFormatting"": ""Paris Hilton - Wikipedia, the free encyclopedia"",
2055 ""content"": ""[1] In 2006, she released her debut album...""
2058 ""GsearchResultClass"": ""GwebSearch"",
2059 ""unescapedUrl"": ""http://www.imdb.com/name/nm0385296/"",
2060 ""url"": ""http://www.imdb.com/name/nm0385296/"",
2061 ""visibleUrl"": ""www.imdb.com"",
2062 ""cacheUrl"": ""http://www.google.com/search?q=cache:1i34KkqnsooJ:www.imdb.com"",
2063 ""title"": ""<b>Paris Hilton</b>"",
2064 ""titleNoFormatting"": ""Paris Hilton"",
2065 ""content"": ""Self: Zoolander. Socialite <b>Paris Hilton</b>...""
2087 ""estimatedResultCount"": ""59600000"",
2088 ""currentPageIndex"": 0,
2089 ""moreResultsUrl"": ""http://www.google.com/search?oe=utf8&ie=utf8...""
2092 ""responseDetails"": null,
2093 ""responseStatus"": 200
2096 JObject googleSearch = JObject.Parse(googleSearchText);
2098 // get JSON result objects into a list
2099 IList<JToken> results = googleSearch["responseData"]["results"].Children().ToList();
2101 // serialize JSON results into .NET objects
2102 IList<SearchResult> searchResults = new List<SearchResult>();
2103 foreach (JToken result in results)
2105 SearchResult searchResult = JsonConvert.DeserializeObject<SearchResult>(result.ToString());
2106 searchResults.Add(searchResult);
2109 // Title = <b>Paris Hilton</b> - Wikipedia, the free encyclopedia
2110 // Content = [1] In 2006, she released her debut album...
2111 // Url = http://en.wikipedia.org/wiki/Paris_Hilton
2113 // Title = <b>Paris Hilton</b>
2114 // Content = Self: Zoolander. Socialite <b>Paris Hilton</b>...
2115 // Url = http://www.imdb.com/name/nm0385296/
2117 Assert.AreEqual(2, searchResults.Count);
2118 Assert.AreEqual("<b>Paris Hilton</b> - Wikipedia, the free encyclopedia", searchResults[0].Title);
2119 Assert.AreEqual("<b>Paris Hilton</b>", searchResults[1].Title);
2123 public void DeserializeBaseReferenceWithDerivedValue()
2125 PersonPropertyClass personPropertyClass = new PersonPropertyClass();
2126 WagePerson wagePerson = (WagePerson)personPropertyClass.Person;
2128 wagePerson.BirthDate = new DateTime(2000, 11, 29, 23, 59, 59, DateTimeKind.Utc);
2129 wagePerson.Department = "McDees";
2130 wagePerson.HourlyWage = 12.50m;
2131 wagePerson.LastModified = new DateTime(2000, 11, 29, 23, 59, 59, DateTimeKind.Utc);
2132 wagePerson.Name = "Jim Bob";
2134 string json = JsonConvert.SerializeObject(personPropertyClass, Formatting.Indented);
2138 ""HourlyWage"": 12.50,
2139 ""Name"": ""Jim Bob"",
2140 ""BirthDate"": ""\/Date(975542399000)\/"",
2141 ""LastModified"": ""\/Date(975542399000)\/""
2146 PersonPropertyClass newPersonPropertyClass = JsonConvert.DeserializeObject<PersonPropertyClass>(json);
2147 Assert.AreEqual(wagePerson.HourlyWage, ((WagePerson)newPersonPropertyClass.Person).HourlyWage);
2150 public class ExistingValueClass
2152 public Dictionary<string, string> Dictionary { get; set; }
2153 public List<string> List { get; set; }
2155 public ExistingValueClass()
2157 Dictionary = new Dictionary<string, string>
2161 List = new List<string>
2169 public void DeserializePopulateDictionaryAndList()
2171 ExistingValueClass d = JsonConvert.DeserializeObject<ExistingValueClass>(@"{'Dictionary':{appended:'appended',existing:'new'}}");
2173 Assert.IsNotNull(d);
2174 Assert.IsNotNull(d.Dictionary);
2175 Assert.AreEqual(typeof(Dictionary<string, string>), d.Dictionary.GetType());
2176 Assert.AreEqual(typeof(List<string>), d.List.GetType());
2177 Assert.AreEqual(2, d.Dictionary.Count);
2178 Assert.AreEqual("new", d.Dictionary["existing"]);
2179 Assert.AreEqual("appended", d.Dictionary["appended"]);
2180 Assert.AreEqual(1, d.List.Count);
2181 Assert.AreEqual("existing", d.List[0]);
2184 public interface IKeyValueId
2186 int Id { get; set; }
2187 string Key { get; set; }
2188 string Value { get; set; }
2192 public class KeyValueId : IKeyValueId
2194 public int Id { get; set; }
2195 public string Key { get; set; }
2196 public string Value { get; set; }
2199 public class ThisGenericTest<T> where T : IKeyValueId
2201 private Dictionary<string, T> _dict1 = new Dictionary<string, T>();
2203 public string MyProperty { get; set; }
2205 public void Add(T item)
2207 this._dict1.Add(item.Key, item);
2210 public T this[string key]
2212 get { return this._dict1[key]; }
2213 set { this._dict1[key] = value; }
2216 public T this[int id]
2218 get { return this._dict1.Values.FirstOrDefault(x => x.Id == id); }
2221 var item = this[id];
2226 this._dict1[item.Key] = value;
2230 public string ToJson()
2232 return JsonConvert.SerializeObject(this, Formatting.Indented);
2237 get { return this._dict1.Values.ToArray<T>(); }
2240 foreach (var item in value)
2247 public void IgnoreIndexedProperties()
2249 ThisGenericTest<KeyValueId> g = new ThisGenericTest<KeyValueId>();
2251 g.Add(new KeyValueId { Id = 1, Key = "key1", Value = "value1" });
2252 g.Add(new KeyValueId { Id = 2, Key = "key2", Value = "value2" });
2254 g.MyProperty = "some value";
2256 string json = g.ToJson();
2259 ""MyProperty"": ""some value"",
2264 ""Value"": ""value1""
2269 ""Value"": ""value2""
2274 ThisGenericTest<KeyValueId> gen = JsonConvert.DeserializeObject<ThisGenericTest<KeyValueId>>(json);
2275 Assert.AreEqual("some value", gen.MyProperty);
2278 public class JRawValueTestObject
2280 public JRaw Value { get; set; }
2284 public void JRawValue()
2286 JRawValueTestObject deserialized = JsonConvert.DeserializeObject<JRawValueTestObject>("{value:3}");
2287 Assert.AreEqual("3", deserialized.Value.ToString());
2289 deserialized = JsonConvert.DeserializeObject<JRawValueTestObject>("{value:'3'}");
2290 Assert.AreEqual(@"""3""", deserialized.Value.ToString());
2294 [ExpectedException(typeof(JsonSerializationException), ExpectedMessage = "Unable to find a default constructor to use for type Newtonsoft.Json.Tests.Serialization.JsonSerializerTest+DictionaryWithNoDefaultConstructor.")]
2295 public void DeserializeDictionaryWithNoDefaultConstructor()
2297 string json = "{key1:'value',key2:'value',key3:'value'}";
2298 JsonConvert.DeserializeObject<DictionaryWithNoDefaultConstructor>(json);
2301 public class DictionaryWithNoDefaultConstructor : Dictionary<string, string>
2303 public DictionaryWithNoDefaultConstructor(IEnumerable<KeyValuePair<string, string>> initial)
2305 foreach (KeyValuePair<string, string> pair in initial)
2307 Add(pair.Key, pair.Value);
2312 [JsonObject(MemberSerialization.OptIn)]
2315 [JsonProperty("A1")]
2317 public string A1 { get { return _A1; } set { _A1 = value; } }
2319 [JsonProperty("A2")]
2320 private string A2 { get; set; }
2323 [JsonObject(MemberSerialization.OptIn)]
2326 public string B1 { get; set; }
2328 [JsonProperty("B2")]
2330 public string B2 { get { return _B2; } set { _B2 = value; } }
2332 [JsonProperty("B3")]
2333 private string B3 { get; set; }
2337 public void SerializeNonPublicBaseJsonProperties()
2340 string json = JsonConvert.SerializeObject(value, Formatting.Indented);
2350 public class TestClass
2352 public string Key { get; set; }
2353 public object Value { get; set; }
2357 public void DeserializeToObjectProperty()
2359 var json = "{ Key: 'abc', Value: 123 }";
2360 var item = JsonConvert.DeserializeObject<TestClass>(json);
2362 Assert.AreEqual(123, item.Value);
2365 public abstract class Animal
2367 public abstract string Name { get; }
2370 public class Human : Animal
2372 public override string Name
2374 get { return typeof(Human).Name; }
2377 public string Ethnicity { get; set; }
2380 #if !NET20 && !PocketPC && !WINDOWS_PHONE
2381 public class DataContractJsonSerializerTestClass
2383 public TimeSpan TimeSpanProperty { get; set; }
2384 public Guid GuidProperty { get; set; }
2385 public Animal AnimalProperty { get; set; }
2386 public Exception ExceptionProperty { get; set; }
2390 public void DataContractJsonSerializerTest()
2392 Exception ex = new Exception("Blah blah blah");
2394 DataContractJsonSerializerTestClass c = new DataContractJsonSerializerTestClass();
2395 c.TimeSpanProperty = new TimeSpan(200, 20, 59, 30, 900);
2396 c.GuidProperty = new Guid("66143115-BE2A-4a59-AF0A-348E1EA15B1E");
2397 c.AnimalProperty = new Human() { Ethnicity = "European" };
2398 c.ExceptionProperty = ex;
2400 MemoryStream ms = new MemoryStream();
2401 DataContractJsonSerializer serializer = new DataContractJsonSerializer(
2402 typeof(DataContractJsonSerializerTestClass),
2403 new Type[] { typeof(Human) });
2404 serializer.WriteObject(ms, c);
2406 byte[] jsonBytes = ms.ToArray();
2407 string json = Encoding.UTF8.GetString(jsonBytes, 0, jsonBytes.Length);
2409 Console.WriteLine(JObject.Parse(json).ToString());
2410 Console.WriteLine();
2412 Console.WriteLine(JsonConvert.SerializeObject(c, Formatting.Indented, new JsonSerializerSettings
2414 // TypeNameHandling = TypeNameHandling.Objects
2419 public class ModelStateDictionary<T> : IDictionary<string, T>
2422 private readonly Dictionary<string, T> _innerDictionary = new Dictionary<string, T>(StringComparer.OrdinalIgnoreCase);
2424 public ModelStateDictionary()
2428 public ModelStateDictionary(ModelStateDictionary<T> dictionary)
2430 if (dictionary == null)
2432 throw new ArgumentNullException("dictionary");
2435 foreach (var entry in dictionary)
2437 _innerDictionary.Add(entry.Key, entry.Value);
2445 return _innerDictionary.Count;
2449 public bool IsReadOnly
2453 return ((IDictionary<string, T>)_innerDictionary).IsReadOnly;
2457 public ICollection<string> Keys
2461 return _innerDictionary.Keys;
2465 public T this[string key]
2470 _innerDictionary.TryGetValue(key, out value);
2475 _innerDictionary[key] = value;
2479 public ICollection<T> Values
2483 return _innerDictionary.Values;
2487 public void Add(KeyValuePair<string, T> item)
2489 ((IDictionary<string, T>)_innerDictionary).Add(item);
2492 public void Add(string key, T value)
2494 _innerDictionary.Add(key, value);
2499 _innerDictionary.Clear();
2502 public bool Contains(KeyValuePair<string, T> item)
2504 return ((IDictionary<string, T>)_innerDictionary).Contains(item);
2507 public bool ContainsKey(string key)
2509 return _innerDictionary.ContainsKey(key);
2512 public void CopyTo(KeyValuePair<string, T>[] array, int arrayIndex)
2514 ((IDictionary<string, T>)_innerDictionary).CopyTo(array, arrayIndex);
2517 public IEnumerator<KeyValuePair<string, T>> GetEnumerator()
2519 return _innerDictionary.GetEnumerator();
2522 public void Merge(ModelStateDictionary<T> dictionary)
2524 if (dictionary == null)
2529 foreach (var entry in dictionary)
2531 this[entry.Key] = entry.Value;
2535 public bool Remove(KeyValuePair<string, T> item)
2537 return ((IDictionary<string, T>)_innerDictionary).Remove(item);
2540 public bool Remove(string key)
2542 return _innerDictionary.Remove(key);
2545 public bool TryGetValue(string key, out T value)
2547 return _innerDictionary.TryGetValue(key, out value);
2550 IEnumerator IEnumerable.GetEnumerator()
2552 return ((IEnumerable)_innerDictionary).GetEnumerator();
2557 public void SerializeNonIDictionary()
2559 ModelStateDictionary<string> modelStateDictionary = new ModelStateDictionary<string>();
2560 modelStateDictionary.Add("key", "value");
2562 string json = JsonConvert.SerializeObject(modelStateDictionary);
2564 Assert.AreEqual(@"{""key"":""value""}", json);
2566 ModelStateDictionary<string> newModelStateDictionary = JsonConvert.DeserializeObject<ModelStateDictionary<string>>(json);
2567 Assert.AreEqual(1, newModelStateDictionary.Count);
2568 Assert.AreEqual("value", newModelStateDictionary["key"]);
2571 #if !SILVERLIGHT && !PocketPC
2572 public class ISerializableTestObject : ISerializable
2574 internal string _stringValue;
2575 internal int _intValue;
2576 internal DateTimeOffset _dateTimeOffsetValue;
2577 internal Person _personValue;
2578 internal Person _nullPersonValue;
2579 internal int? _nullableInt;
2580 internal bool _booleanValue;
2581 internal byte _byteValue;
2582 internal char _charValue;
2583 internal DateTime _dateTimeValue;
2584 internal decimal _decimalValue;
2585 internal short _shortValue;
2586 internal long _longValue;
2587 internal sbyte _sbyteValue;
2588 internal float _floatValue;
2589 internal ushort _ushortValue;
2590 internal uint _uintValue;
2591 internal ulong _ulongValue;
2593 public ISerializableTestObject(string stringValue, int intValue, DateTimeOffset dateTimeOffset, Person personValue)
2595 _stringValue = stringValue;
2596 _intValue = intValue;
2597 _dateTimeOffsetValue = dateTimeOffset;
2598 _personValue = personValue;
2599 _dateTimeValue = new DateTime(0, DateTimeKind.Utc);
2602 protected ISerializableTestObject(SerializationInfo info, StreamingContext context)
2604 _stringValue = info.GetString("stringValue");
2605 _intValue = info.GetInt32("intValue");
2606 _dateTimeOffsetValue = (DateTimeOffset)info.GetValue("dateTimeOffsetValue", typeof(DateTimeOffset));
2607 _personValue = (Person)info.GetValue("personValue", typeof(Person));
2608 _nullPersonValue = (Person)info.GetValue("nullPersonValue", typeof(Person));
2609 _nullableInt = (int?)info.GetValue("nullableInt", typeof(int?));
2611 _booleanValue = info.GetBoolean("booleanValue");
2612 _byteValue = info.GetByte("byteValue");
2613 _charValue = info.GetChar("charValue");
2614 _dateTimeValue = info.GetDateTime("dateTimeValue");
2615 _decimalValue = info.GetDecimal("decimalValue");
2616 _shortValue = info.GetInt16("shortValue");
2617 _longValue = info.GetInt64("longValue");
2618 _sbyteValue = info.GetSByte("sbyteValue");
2619 _floatValue = info.GetSingle("floatValue");
2620 _ushortValue = info.GetUInt16("ushortValue");
2621 _uintValue = info.GetUInt32("uintValue");
2622 _ulongValue = info.GetUInt64("ulongValue");
2625 public void GetObjectData(SerializationInfo info, StreamingContext context)
2627 info.AddValue("stringValue", _stringValue);
2628 info.AddValue("intValue", _intValue);
2629 info.AddValue("dateTimeOffsetValue", _dateTimeOffsetValue);
2630 info.AddValue("personValue", _personValue);
2631 info.AddValue("nullPersonValue", _nullPersonValue);
2632 info.AddValue("nullableInt", null);
2634 info.AddValue("booleanValue", _booleanValue);
2635 info.AddValue("byteValue", _byteValue);
2636 info.AddValue("charValue", _charValue);
2637 info.AddValue("dateTimeValue", _dateTimeValue);
2638 info.AddValue("decimalValue", _decimalValue);
2639 info.AddValue("shortValue", _shortValue);
2640 info.AddValue("longValue", _longValue);
2641 info.AddValue("sbyteValue", _sbyteValue);
2642 info.AddValue("floatValue", _floatValue);
2643 info.AddValue("ushortValue", _ushortValue);
2644 info.AddValue("uintValue", _uintValue);
2645 info.AddValue("ulongValue", _ulongValue);
2650 public void SerializeISerializableTestObject()
2652 Person person = new Person();
2653 person.BirthDate = new DateTime(2000, 1, 1, 1, 1, 1, DateTimeKind.Utc);
2654 person.LastModified = person.BirthDate;
2655 person.Department = "Department!";
2656 person.Name = "Name!";
2658 DateTimeOffset dateTimeOffset = new DateTimeOffset(2000, 12, 20, 22, 59, 59, TimeSpan.FromHours(2));
2659 string dateTimeOffsetText;
2661 dateTimeOffsetText = @"\/Date(977345999000+0200)\/";
2663 dateTimeOffsetText = @"12/20/2000 22:59:59 +02:00";
2666 ISerializableTestObject o = new ISerializableTestObject("String!", int.MinValue, dateTimeOffset, person);
2668 string json = JsonConvert.SerializeObject(o, Formatting.Indented);
2670 ""stringValue"": ""String!"",
2671 ""intValue"": -2147483648,
2672 ""dateTimeOffsetValue"": """ + dateTimeOffsetText + @""",
2674 ""Name"": ""Name!"",
2675 ""BirthDate"": ""\/Date(946688461000)\/"",
2676 ""LastModified"": ""\/Date(946688461000)\/""
2678 ""nullPersonValue"": null,
2679 ""nullableInt"": null,
2680 ""booleanValue"": false,
2682 ""charValue"": ""\u0000"",
2683 ""dateTimeValue"": ""\/Date(-62135596800000)\/"",
2684 ""decimalValue"": 0.0,
2688 ""floatValue"": 0.0,
2694 ISerializableTestObject o2 = JsonConvert.DeserializeObject<ISerializableTestObject>(json);
2695 Assert.AreEqual("String!", o2._stringValue);
2696 Assert.AreEqual(int.MinValue, o2._intValue);
2697 Assert.AreEqual(dateTimeOffset, o2._dateTimeOffsetValue);
2698 Assert.AreEqual("Name!", o2._personValue.Name);
2699 Assert.AreEqual(null, o2._nullPersonValue);
2700 Assert.AreEqual(null, o2._nullableInt);
2704 public class KVPair<TKey, TValue>
2706 public TKey Key { get; set; }
2707 public TValue Value { get; set; }
2709 public KVPair(TKey k, TValue v)
2717 public void DeserializeUsingNonDefaultConstructorWithLeftOverValues()
2719 List<KVPair<string, string>> kvPairs =
2720 JsonConvert.DeserializeObject<List<KVPair<string, string>>>(
2721 "[{\"Key\":\"Two\",\"Value\":\"2\"},{\"Key\":\"One\",\"Value\":\"1\"}]");
2723 Assert.AreEqual(2, kvPairs.Count);
2724 Assert.AreEqual("Two", kvPairs[0].Key);
2725 Assert.AreEqual("2", kvPairs[0].Value);
2726 Assert.AreEqual("One", kvPairs[1].Key);
2727 Assert.AreEqual("1", kvPairs[1].Value);
2731 public void SerializeClassWithInheritedProtectedMember()
2734 string json = JsonConvert.SerializeObject(myA, Formatting.Indented);
2737 ""AA_property1"": 2,
2738 ""AA_property2"": 2,
2739 ""AA_property3"": 2,
2743 BB myB = new BB(3, 4);
2744 json = JsonConvert.SerializeObject(myB, Formatting.Indented);
2749 ""BB_property1"": 4,
2750 ""BB_property2"": 4,
2751 ""BB_property3"": 4,
2752 ""BB_property4"": 4,
2753 ""BB_property5"": 4,
2754 ""BB_property7"": 4,
2755 ""AA_property1"": 3,
2756 ""AA_property2"": 3,
2757 ""AA_property3"": 3,
2763 public void DeserializeClassWithInheritedProtectedMember()
2765 AA myA = JsonConvert.DeserializeObject<AA>(
2769 ""AA_property1"": 2,
2770 ""AA_property2"": 2,
2771 ""AA_property3"": 2,
2772 ""AA_property4"": 2,
2773 ""AA_property5"": 2,
2777 Assert.AreEqual(2, ReflectionUtils.GetMemberValue(typeof(AA).GetField("AA_field1", BindingFlags.Instance | BindingFlags.NonPublic), myA));
2778 Assert.AreEqual(0, ReflectionUtils.GetMemberValue(typeof(AA).GetField("AA_field2", BindingFlags.Instance | BindingFlags.NonPublic), myA));
2779 Assert.AreEqual(2, ReflectionUtils.GetMemberValue(typeof(AA).GetProperty("AA_property1", BindingFlags.Instance | BindingFlags.NonPublic), myA));
2780 Assert.AreEqual(2, ReflectionUtils.GetMemberValue(typeof(AA).GetProperty("AA_property2", BindingFlags.Instance | BindingFlags.NonPublic), myA));
2781 Assert.AreEqual(2, ReflectionUtils.GetMemberValue(typeof(AA).GetProperty("AA_property3", BindingFlags.Instance | BindingFlags.NonPublic), myA));
2782 Assert.AreEqual(2, ReflectionUtils.GetMemberValue(typeof(AA).GetProperty("AA_property4", BindingFlags.Instance | BindingFlags.NonPublic), myA));
2783 Assert.AreEqual(0, ReflectionUtils.GetMemberValue(typeof(AA).GetProperty("AA_property5", BindingFlags.Instance | BindingFlags.NonPublic), myA));
2784 Assert.AreEqual(0, ReflectionUtils.GetMemberValue(typeof(AA).GetProperty("AA_property6", BindingFlags.Instance | BindingFlags.NonPublic), myA));
2786 BB myB = JsonConvert.DeserializeObject<BB>(
2792 ""AA_property1"": 2,
2793 ""AA_property2"": 2,
2794 ""AA_property3"": 2,
2795 ""AA_property4"": 2,
2796 ""AA_property5"": 2,
2797 ""AA_property6"": 2,
2798 ""BB_property1"": 3,
2799 ""BB_property2"": 3,
2800 ""BB_property3"": 3,
2801 ""BB_property4"": 3,
2802 ""BB_property5"": 3,
2803 ""BB_property6"": 3,
2804 ""BB_property7"": 3,
2808 Assert.AreEqual(3, ReflectionUtils.GetMemberValue(typeof(AA).GetField("AA_field1", BindingFlags.Instance | BindingFlags.NonPublic), myB));
2809 Assert.AreEqual(0, ReflectionUtils.GetMemberValue(typeof(AA).GetField("AA_field2", BindingFlags.Instance | BindingFlags.NonPublic), myB));
2810 Assert.AreEqual(2, ReflectionUtils.GetMemberValue(typeof(AA).GetProperty("AA_property1", BindingFlags.Instance | BindingFlags.NonPublic), myB));
2811 Assert.AreEqual(2, ReflectionUtils.GetMemberValue(typeof(AA).GetProperty("AA_property2", BindingFlags.Instance | BindingFlags.NonPublic), myB));
2812 Assert.AreEqual(2, ReflectionUtils.GetMemberValue(typeof(AA).GetProperty("AA_property3", BindingFlags.Instance | BindingFlags.NonPublic), myB));
2813 Assert.AreEqual(2, ReflectionUtils.GetMemberValue(typeof(AA).GetProperty("AA_property4", BindingFlags.Instance | BindingFlags.NonPublic), myB));
2814 Assert.AreEqual(0, ReflectionUtils.GetMemberValue(typeof(AA).GetProperty("AA_property5", BindingFlags.Instance | BindingFlags.NonPublic), myB));
2815 Assert.AreEqual(0, ReflectionUtils.GetMemberValue(typeof(AA).GetProperty("AA_property6", BindingFlags.Instance | BindingFlags.NonPublic), myB));
2817 Assert.AreEqual(4, myB.BB_field1);
2818 Assert.AreEqual(4, myB.BB_field2);
2819 Assert.AreEqual(3, myB.BB_property1);
2820 Assert.AreEqual(3, myB.BB_property2);
2821 Assert.AreEqual(3, ReflectionUtils.GetMemberValue(typeof(BB).GetProperty("BB_property3", BindingFlags.Instance | BindingFlags.Public), myB));
2822 Assert.AreEqual(3, ReflectionUtils.GetMemberValue(typeof(BB).GetProperty("BB_property4", BindingFlags.Instance | BindingFlags.NonPublic), myB));
2823 Assert.AreEqual(0, myB.BB_property5);
2824 Assert.AreEqual(3, ReflectionUtils.GetMemberValue(typeof(BB).GetProperty("BB_property6", BindingFlags.Instance | BindingFlags.Public), myB));
2825 Assert.AreEqual(3, ReflectionUtils.GetMemberValue(typeof(BB).GetProperty("BB_property7", BindingFlags.Instance | BindingFlags.Public), myB));
2826 Assert.AreEqual(3, ReflectionUtils.GetMemberValue(typeof(BB).GetProperty("BB_property8", BindingFlags.Instance | BindingFlags.Public), myB));
2832 protected int AA_field1;
2833 protected int AA_field2;
2835 protected int AA_property1 { get; set; }
2837 protected int AA_property2 { get; private set; }
2839 protected int AA_property3 { private get; set; }
2841 private int AA_property4 { get; set; }
2842 protected int AA_property5 { get; private set; }
2843 protected int AA_property6 { private get; set; }
2862 public class BB : AA
2865 public int BB_field1;
2866 public int BB_field2;
2868 public int BB_property1 { get; set; }
2870 public int BB_property2 { get; private set; }
2872 public int BB_property3 { private get; set; }
2874 private int BB_property4 { get; set; }
2875 public int BB_property5 { get; private set; }
2876 public int BB_property6 { private get; set; }
2878 public int BB_property7 { protected get; set; }
2879 public int BB_property8 { protected get; set; }
2885 public BB(int f, int g)
2901 #if !NET20 && !SILVERLIGHT
2902 public class XNodeTestObject
2904 public XDocument Document { get; set; }
2905 public XElement Element { get; set; }
2910 public class XmlNodeTestObject
2912 public XmlDocument Document { get; set; }
2916 #if !NET20 && !SILVERLIGHT
2918 public void SerializeDeserializeXNodeProperties()
2920 XNodeTestObject testObject = new XNodeTestObject();
2921 testObject.Document = XDocument.Parse("<root>hehe, root</root>");
2922 testObject.Element = XElement.Parse(@"<fifth xmlns:json=""http://json.org"" json:Awesome=""true"">element</fifth>");
2924 string json = JsonConvert.SerializeObject(testObject, Formatting.Indented);
2925 string expected = @"{
2927 ""root"": ""hehe, root""
2931 ""@xmlns:json"": ""http://json.org"",
2932 ""@json:Awesome"": ""true"",
2933 ""#text"": ""element""
2937 Assert.AreEqual(expected, json);
2939 XNodeTestObject newTestObject = JsonConvert.DeserializeObject<XNodeTestObject>(json);
2940 Assert.AreEqual(testObject.Document.ToString(), newTestObject.Document.ToString());
2941 Assert.AreEqual(testObject.Element.ToString(), newTestObject.Element.ToString());
2943 Assert.IsNull(newTestObject.Element.Parent);
2949 public void SerializeDeserializeXmlNodeProperties()
2951 XmlNodeTestObject testObject = new XmlNodeTestObject();
2952 XmlDocument document = new XmlDocument();
2953 document.LoadXml("<root>hehe, root</root>");
2954 testObject.Document = document;
2956 string json = JsonConvert.SerializeObject(testObject, Formatting.Indented);
2957 string expected = @"{
2959 ""root"": ""hehe, root""
2962 Assert.AreEqual(expected, json);
2964 XmlNodeTestObject newTestObject = JsonConvert.DeserializeObject<XmlNodeTestObject>(json);
2965 Assert.AreEqual(testObject.Document.InnerXml, newTestObject.Document.InnerXml);
2970 public void FullClientMapSerialization()
2972 ClientMap source = new ClientMap()
2974 position = new Pos() { X = 100, Y = 200 },
2975 center = new PosDouble() { X = 251.6, Y = 361.3 }
2978 string json = JsonConvert.SerializeObject(source, new PosConverter(), new PosDoubleConverter());
2979 Assert.AreEqual("{\"position\":new Pos(100,200),\"center\":new PosD(251.6,361.3)}", json);
2982 public class ClientMap
2984 public Pos position { get; set; }
2985 public PosDouble center { get; set; }
2990 public int X { get; set; }
2991 public int Y { get; set; }
2994 public class PosDouble
2996 public double X { get; set; }
2997 public double Y { get; set; }
3000 public class PosConverter : JsonConverter
3002 public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
3007 writer.WriteRawValue(String.Format("new Pos({0},{1})", p.X, p.Y));
3012 public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
3014 throw new NotImplementedException();
3017 public override bool CanConvert(Type objectType)
3019 return objectType.IsAssignableFrom(typeof(Pos));
3023 public class PosDoubleConverter : JsonConverter
3025 public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
3027 PosDouble p = (PosDouble)value;
3030 writer.WriteRawValue(String.Format(CultureInfo.InvariantCulture, "new PosD({0},{1})", p.X, p.Y));
3035 public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
3037 throw new NotImplementedException();
3040 public override bool CanConvert(Type objectType)
3042 return objectType.IsAssignableFrom(typeof(PosDouble));
3047 public void TestEscapeDictionaryStrings()
3049 const string s = @"host\user";
3050 string serialized = JsonConvert.SerializeObject(s);
3051 Assert.AreEqual(@"""host\\user""", serialized);
3053 Dictionary<int, object> d1 = new Dictionary<int, object>();
3055 Assert.AreEqual(@"{""5"":""host\\user""}", JsonConvert.SerializeObject(d1));
3057 Dictionary<string, object> d2 = new Dictionary<string, object>();
3059 Assert.AreEqual(@"{""host\\user"":5}", JsonConvert.SerializeObject(d2));
3062 public class GenericListTestClass
3064 public List<string> GenericList { get; set; }
3066 public GenericListTestClass()
3068 GenericList = new List<string>();
3073 public void DeserializeExistingGenericList()
3075 GenericListTestClass c = new GenericListTestClass();
3076 c.GenericList.Add("1");
3077 c.GenericList.Add("2");
3079 string json = JsonConvert.SerializeObject(c, Formatting.Indented);
3081 GenericListTestClass newValue = JsonConvert.DeserializeObject<GenericListTestClass>(json);
3082 Assert.AreEqual(2, newValue.GenericList.Count);
3083 Assert.AreEqual(typeof(List<string>), newValue.GenericList.GetType());
3087 public void DeserializeSimpleKeyValuePair()
3089 List<KeyValuePair<string, string>> list = new List<KeyValuePair<string, string>>();
3090 list.Add(new KeyValuePair<string, string>("key1", "value1"));
3091 list.Add(new KeyValuePair<string, string>("key2", "value2"));
3093 string json = JsonConvert.SerializeObject(list);
3095 Assert.AreEqual(@"[{""Key"":""key1"",""Value"":""value1""},{""Key"":""key2"",""Value"":""value2""}]", json);
3097 List<KeyValuePair<string, string>> result = JsonConvert.DeserializeObject<List<KeyValuePair<string, string>>>(json);
3098 Assert.AreEqual(2, result.Count);
3099 Assert.AreEqual("key1", result[0].Key);
3100 Assert.AreEqual("value1", result[0].Value);
3101 Assert.AreEqual("key2", result[1].Key);
3102 Assert.AreEqual("value2", result[1].Value);
3106 public void DeserializeComplexKeyValuePair()
3108 DateTime dateTime = new DateTime(2000, 12, 1, 23, 1, 1, DateTimeKind.Utc);
3110 List<KeyValuePair<string, WagePerson>> list = new List<KeyValuePair<string, WagePerson>>();
3111 list.Add(new KeyValuePair<string, WagePerson>("key1", new WagePerson
3113 BirthDate = dateTime,
3114 Department = "Department1",
3115 LastModified = dateTime,
3118 list.Add(new KeyValuePair<string, WagePerson>("key2", new WagePerson
3120 BirthDate = dateTime,
3121 Department = "Department2",
3122 LastModified = dateTime,
3126 string json = JsonConvert.SerializeObject(list, Formatting.Indented);
3132 ""HourlyWage"": 1.0,
3134 ""BirthDate"": ""\/Date(975711661000)\/"",
3135 ""LastModified"": ""\/Date(975711661000)\/""
3141 ""HourlyWage"": 2.0,
3143 ""BirthDate"": ""\/Date(975711661000)\/"",
3144 ""LastModified"": ""\/Date(975711661000)\/""
3149 List<KeyValuePair<string, WagePerson>> result = JsonConvert.DeserializeObject<List<KeyValuePair<string, WagePerson>>>(json);
3150 Assert.AreEqual(2, result.Count);
3151 Assert.AreEqual("key1", result[0].Key);
3152 Assert.AreEqual(1, result[0].Value.HourlyWage);
3153 Assert.AreEqual("key2", result[1].Key);
3154 Assert.AreEqual(2, result[1].Value.HourlyWage);
3157 public class StringListAppenderConverter : JsonConverter
3159 public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
3161 writer.WriteValue(value);
3164 public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
3166 List<string> existingStrings = (List<string>)existingValue;
3167 List<string> newStrings = new List<string>(existingStrings);
3171 while (reader.TokenType != JsonToken.EndArray)
3173 string s = (string)reader.Value;
3182 public override bool CanConvert(Type objectType)
3184 return (objectType == typeof(List<string>));
3189 public void StringListAppenderConverterTest()
3191 Movie p = new Movie();
3192 p.ReleaseCountries = new List<string> { "Existing" };
3194 JsonConvert.PopulateObject("{'ReleaseCountries':['Appended']}", p, new JsonSerializerSettings
3196 Converters = new List<JsonConverter> { new StringListAppenderConverter() }
3199 Assert.AreEqual(2, p.ReleaseCountries.Count);
3200 Assert.AreEqual("Existing", p.ReleaseCountries[0]);
3201 Assert.AreEqual("Appended", p.ReleaseCountries[1]);
3204 public class StringAppenderConverter : JsonConverter
3206 public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
3208 writer.WriteValue(value);
3211 public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
3213 string existingString = (string)existingValue;
3214 string newString = existingString + (string)reader.Value;
3219 public override bool CanConvert(Type objectType)
3221 return (objectType == typeof(string));
3226 public void StringAppenderConverterTest()
3228 Movie p = new Movie();
3229 p.Name = "Existing,";
3231 JsonConvert.PopulateObject("{'Name':'Appended'}", p, new JsonSerializerSettings
3233 Converters = new List<JsonConverter> { new StringAppenderConverter() }
3236 Assert.AreEqual(p.Name, "Existing,Appended");
3240 [ExpectedException(typeof(JsonSerializationException), ExpectedMessage = "Additional content found in JSON reference object. A JSON reference object should only have a $ref property.")]
3241 public void SerializeRefAdditionalContent()
3243 //Additional text found in JSON string after finishing deserializing object.
3245 var reference = new Dictionary<string, object>();
3246 reference.Add("$ref", "Persons");
3247 reference.Add("$id", 1);
3249 var child = new Dictionary<string, object>();
3250 child.Add("_id", 2);
3251 child.Add("Name", "Isabell");
3252 child.Add("Father", reference);
3254 var json = JsonConvert.SerializeObject(child);
3255 JsonConvert.DeserializeObject<Dictionary<string, object>>(json);
3259 [ExpectedException(typeof(JsonSerializationException), ExpectedMessage = "JSON reference $ref property must have a string value.")]
3260 public void SerializeRefBadType()
3262 //Additional text found in JSON string after finishing deserializing object.
3264 var reference = new Dictionary<string, object>();
3265 reference.Add("$ref", 1);
3266 reference.Add("$id", 1);
3268 var child = new Dictionary<string, object>();
3269 child.Add("_id", 2);
3270 child.Add("Name", "Isabell");
3271 child.Add("Father", reference);
3273 var json = JsonConvert.SerializeObject(child);
3274 JsonConvert.DeserializeObject<Dictionary<string, object>>(json);
3277 public class ConstructorCompexIgnoredProperty
3280 public Product Ignored { get; set; }
3281 public string First { get; set; }
3282 public int Second { get; set; }
3284 public ConstructorCompexIgnoredProperty(string first, int second)
3292 public void DeserializeIgnoredPropertyInConstructor()
3294 string json = @"{""First"":""First"",""Second"":2,""Ignored"":{""Name"":""James""},""AdditionalContent"":{""LOL"":true}}";
3296 ConstructorCompexIgnoredProperty cc = JsonConvert.DeserializeObject<ConstructorCompexIgnoredProperty>(json);
3297 Assert.AreEqual("First", cc.First);
3298 Assert.AreEqual(2, cc.Second);
3299 Assert.AreEqual(null, cc.Ignored);
3302 public class ShouldSerializeTestClass
3304 internal bool _shouldSerializeName;
3306 public string Name { get; set; }
3307 public int Age { get; set; }
3309 public void ShouldSerializeAge()
3311 // dummy. should never be used because it doesn't return bool
3314 public bool ShouldSerializeName()
3316 return _shouldSerializeName;
3321 public void ShouldSerializeTest()
3323 ShouldSerializeTestClass c = new ShouldSerializeTestClass();
3327 string json = JsonConvert.SerializeObject(c, Formatting.Indented);
3333 c._shouldSerializeName = true;
3334 json = JsonConvert.SerializeObject(c, Formatting.Indented);
3337 ""Name"": ""James"",
3341 ShouldSerializeTestClass deserialized = JsonConvert.DeserializeObject<ShouldSerializeTestClass>(json);
3342 Assert.AreEqual("James", deserialized.Name);
3343 Assert.AreEqual(27, deserialized.Age);
3346 public class Employee
3348 public string Name { get; set; }
3349 public Employee Manager { get; set; }
3351 public bool ShouldSerializeManager()
3353 return (Manager != this);
3358 public void ShouldSerializeExample()
3360 Employee joe = new Employee();
3361 joe.Name = "Joe Employee";
3362 Employee mike = new Employee();
3363 mike.Name = "Mike Manager";
3366 mike.Manager = mike;
3368 string json = JsonConvert.SerializeObject(new[] { joe, mike }, Formatting.Indented);
3371 // "Name": "Joe Employee",
3373 // "Name": "Mike Manager"
3377 // "Name": "Mike Manager"
3381 Console.WriteLine(json);
3384 public class SpecifiedTestClass
3386 private bool _nameSpecified;
3388 public string Name { get; set; }
3389 public int Age { get; set; }
3390 public int Weight { get; set; }
3391 public int Height { get; set; }
3393 // dummy. should never be used because it isn't of type bool
3395 public long AgeSpecified { get; set; }
3398 public bool NameSpecified
3400 get { return _nameSpecified; }
3401 set { _nameSpecified = value; }
3405 public bool WeightSpecified;
3408 [System.Xml.Serialization.XmlIgnoreAttribute]
3409 public bool HeightSpecified;
3413 public void SpecifiedTest()
3415 SpecifiedTestClass c = new SpecifiedTestClass();
3418 c.NameSpecified = false;
3420 string json = JsonConvert.SerializeObject(c, Formatting.Indented);
3426 SpecifiedTestClass deserialized = JsonConvert.DeserializeObject<SpecifiedTestClass>(json);
3427 Assert.IsNull(deserialized.Name);
3428 Assert.IsFalse(deserialized.NameSpecified);
3429 Assert.IsFalse(deserialized.WeightSpecified);
3430 Assert.IsFalse(deserialized.HeightSpecified);
3431 Assert.AreEqual(27, deserialized.Age);
3433 c.NameSpecified = true;
3434 c.WeightSpecified = true;
3435 c.HeightSpecified = true;
3436 json = JsonConvert.SerializeObject(c, Formatting.Indented);
3439 ""Name"": ""James"",
3445 deserialized = JsonConvert.DeserializeObject<SpecifiedTestClass>(json);
3446 Assert.AreEqual("James", deserialized.Name);
3447 Assert.IsTrue(deserialized.NameSpecified);
3448 Assert.IsTrue(deserialized.WeightSpecified);
3449 Assert.IsTrue(deserialized.HeightSpecified);
3450 Assert.AreEqual(27, deserialized.Age);
3454 // public void XmlSerializerSpecifiedTrueTest()
3456 // XmlSerializer s = new XmlSerializer(typeof(OptionalOrder));
3458 // StringWriter sw = new StringWriter();
3459 // s.Serialize(sw, new OptionalOrder() { FirstOrder = "First", FirstOrderSpecified = true });
3461 // Console.WriteLine(sw.ToString());
3463 // string xml = @"<?xml version=""1.0"" encoding=""utf-16""?>
3464 //<OptionalOrder xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"">
3465 // <FirstOrder>First</FirstOrder>
3466 //</OptionalOrder>";
3468 // OptionalOrder o = (OptionalOrder)s.Deserialize(new StringReader(xml));
3469 // Console.WriteLine(o.FirstOrder);
3470 // Console.WriteLine(o.FirstOrderSpecified);
3474 // public void XmlSerializerSpecifiedFalseTest()
3476 // XmlSerializer s = new XmlSerializer(typeof(OptionalOrder));
3478 // StringWriter sw = new StringWriter();
3479 // s.Serialize(sw, new OptionalOrder() { FirstOrder = "First", FirstOrderSpecified = false });
3481 // Console.WriteLine(sw.ToString());
3483 // // string xml = @"<?xml version=""1.0"" encoding=""utf-16""?>
3484 // //<OptionalOrder xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"">
3485 // // <FirstOrder>First</FirstOrder>
3486 // //</OptionalOrder>";
3488 // // OptionalOrder o = (OptionalOrder)s.Deserialize(new StringReader(xml));
3489 // // Console.WriteLine(o.FirstOrder);
3490 // // Console.WriteLine(o.FirstOrderSpecified);
3493 public class OptionalOrder
3495 // This field shouldn't be serialized
3496 // if it is uninitialized.
3497 public string FirstOrder;
3498 // Use the XmlIgnoreAttribute to ignore the
3499 // special field named "FirstOrderSpecified".
3500 [System.Xml.Serialization.XmlIgnoreAttribute]
3501 public bool FirstOrderSpecified;
3504 public class FamilyDetails
3506 public string Name { get; set; }
3507 public int NumberOfChildren { get; set; }
3510 public bool NumberOfChildrenSpecified { get; set; }
3514 public void SpecifiedExample()
3516 FamilyDetails joe = new FamilyDetails();
3517 joe.Name = "Joe Family Details";
3518 joe.NumberOfChildren = 4;
3519 joe.NumberOfChildrenSpecified = true;
3521 FamilyDetails martha = new FamilyDetails();
3522 martha.Name = "Martha Family Details";
3523 martha.NumberOfChildren = 3;
3524 martha.NumberOfChildrenSpecified = false;
3526 string json = JsonConvert.SerializeObject(new[] { joe, martha }, Formatting.Indented);
3529 // "Name": "Joe Family Details",
3530 // "NumberOfChildren": 4
3533 // "Name": "Martha Family Details"
3536 Console.WriteLine(json);
3538 string mikeString = "{\"Name\": \"Mike Person\"}";
3539 FamilyDetails mike = JsonConvert.DeserializeObject<FamilyDetails>(mikeString);
3541 Console.WriteLine("mikeString specifies number of children: {0}", mike.NumberOfChildrenSpecified);
3543 string mikeFullDisclosureString = "{\"Name\": \"Mike Person\", \"NumberOfChildren\": \"0\"}";
3544 mike = JsonConvert.DeserializeObject<FamilyDetails>(mikeFullDisclosureString);
3546 Console.WriteLine("mikeString specifies number of children: {0}", mike.NumberOfChildrenSpecified);
3549 public class DictionaryKey
3551 public string Value { get; set; }
3553 public override string ToString()
3558 public static implicit operator DictionaryKey(string value)
3560 return new DictionaryKey() { Value = value };
3565 public void SerializeDeserializeDictionaryKey()
3567 Dictionary<DictionaryKey, string> dictionary = new Dictionary<DictionaryKey, string>();
3569 dictionary.Add(new DictionaryKey() { Value = "First!" }, "First");
3570 dictionary.Add(new DictionaryKey() { Value = "Second!" }, "Second");
3572 string json = JsonConvert.SerializeObject(dictionary, Formatting.Indented);
3575 ""First!"": ""First"",
3576 ""Second!"": ""Second""
3579 Dictionary<DictionaryKey, string> newDictionary =
3580 JsonConvert.DeserializeObject<Dictionary<DictionaryKey, string>>(json);
3582 Assert.AreEqual(2, newDictionary.Count);
3586 public void SerializeNullableArray()
3588 string jsonText = JsonConvert.SerializeObject(new double?[] { 2.4, 4.3, null }, Formatting.Indented);
3596 double?[] d = (double?[])JsonConvert.DeserializeObject(jsonText, typeof(double?[]));
3598 Assert.AreEqual(3, d.Length);
3599 Assert.AreEqual(2.4, d[0]);
3600 Assert.AreEqual(4.3, d[1]);
3601 Assert.AreEqual(null, d[2]);
3604 #if !SILVERLIGHT && !NET20 && !PocketPC
3606 public void SerializeHashSet()
3608 string jsonText = JsonConvert.SerializeObject(new HashSet<string>()
3613 }, Formatting.Indented);
3621 HashSet<string> d = JsonConvert.DeserializeObject<HashSet<string>>(jsonText);
3623 Assert.AreEqual(3, d.Count);
3624 Assert.IsTrue(d.Contains("One"));
3625 Assert.IsTrue(d.Contains("2"));
3626 Assert.IsTrue(d.Contains("III"));
3630 private class MyClass
3632 public byte[] Prop1 { get; set; }
3636 Prop1 = new byte[0];
3641 public void DeserializeByteArray()
3643 JsonSerializer serializer1 = new JsonSerializer();
3644 serializer1.Converters.Add(new IsoDateTimeConverter());
3645 serializer1.NullValueHandling = NullValueHandling.Ignore;
3647 string json = @"[{""Prop1"":""""},{""Prop1"":""""}]";
3649 JsonTextReader reader = new JsonTextReader(new StringReader(json));
3651 MyClass[] z = (MyClass[])serializer1.Deserialize(reader, typeof(MyClass[]));
3652 Assert.AreEqual(2, z.Length);
3653 Assert.AreEqual(0, z[0].Prop1.Length);
3654 Assert.AreEqual(0, z[1].Prop1.Length);
3657 #if !NET20 && !PocketPC && !SILVERLIGHT
3658 public class StringDictionaryTestClass
3660 public StringDictionary StringDictionaryProperty { get; set; }
3664 [ExpectedException(typeof(Exception), ExpectedMessage = "Cannot create and populate list type System.Collections.Specialized.StringDictionary.")]
3665 public void StringDictionaryTest()
3667 StringDictionaryTestClass s1 = new StringDictionaryTestClass()
3669 StringDictionaryProperty = new StringDictionary()
3677 string json = JsonConvert.SerializeObject(s1, Formatting.Indented);
3679 JsonConvert.DeserializeObject<StringDictionaryTestClass>(json);
3683 [JsonObject(MemberSerialization.OptIn)]
3684 public struct StructWithAttribute
3686 public string MyString { get; set; }
3688 public int MyInt { get; set; }
3692 public void SerializeStructWithJsonObjectAttribute()
3694 StructWithAttribute testStruct = new StructWithAttribute
3696 MyInt = int.MaxValue
3699 string json = JsonConvert.SerializeObject(testStruct, Formatting.Indented);
3702 ""MyInt"": 2147483647
3705 StructWithAttribute newStruct = JsonConvert.DeserializeObject<StructWithAttribute>(json);
3707 Assert.AreEqual(int.MaxValue, newStruct.MyInt);
3710 public class TimeZoneOffsetObject
3712 public DateTimeOffset Offset { get; set; }
3717 public void ReadWriteTimeZoneOffset()
3719 var serializeObject = JsonConvert.SerializeObject(new TimeZoneOffsetObject
3721 Offset = new DateTimeOffset(new DateTime(2000, 1, 1), TimeSpan.FromHours(6))
3724 Assert.AreEqual("{\"Offset\":\"\\/Date(946663200000+0600)\\/\"}", serializeObject);
3725 var deserializeObject = JsonConvert.DeserializeObject<TimeZoneOffsetObject>(serializeObject);
3726 Assert.AreEqual(TimeSpan.FromHours(6), deserializeObject.Offset.Offset);
3727 Assert.AreEqual(new DateTime(2000, 1, 1), deserializeObject.Offset.Date);
3731 public void DeserializePropertyNullableDateTimeOffsetExact()
3733 NullableDateTimeTestClass d = JsonConvert.DeserializeObject<NullableDateTimeTestClass>("{\"DateTimeOffsetField\":\"\\/Date(946663200000+0600)\\/\"}");
3734 Assert.AreEqual(new DateTimeOffset(new DateTime(2000, 1, 1), TimeSpan.FromHours(6)), d.DateTimeOffsetField);
3738 public abstract class LogEvent
3740 [JsonProperty("event")]
3741 public abstract string EventName { get; }
3744 public class DerivedEvent : LogEvent
3746 public override string EventName { get { return "derived"; } }
3750 public void OverridenPropertyMembers()
3752 string json = JsonConvert.SerializeObject(new DerivedEvent(), Formatting.Indented);
3755 ""event"": ""derived""
3759 #if !(NET35 || NET20 || WINDOWS_PHONE)
3761 public void SerializeExpandoObject()
3763 dynamic expando = new ExpandoObject();
3765 expando.Decimal = 99.9d;
3766 expando.Complex = new ExpandoObject();
3767 expando.Complex.String = "I am a string";
3768 expando.Complex.DateTime = new DateTime(2000, 12, 20, 18, 55, 0, DateTimeKind.Utc);
3770 string json = JsonConvert.SerializeObject(expando, Formatting.Indented);
3775 ""String"": ""I am a string"",
3776 ""DateTime"": ""\/Date(977338500000)\/""
3780 IDictionary<string, object> newExpando = JsonConvert.DeserializeObject<ExpandoObject>(json);
3782 Assert.IsInstanceOfType(typeof(long), newExpando["Int"]);
3783 Assert.AreEqual(expando.Int, newExpando["Int"]);
3785 Assert.IsInstanceOfType(typeof(double), newExpando["Decimal"]);
3786 Assert.AreEqual(expando.Decimal, newExpando["Decimal"]);
3788 Assert.IsInstanceOfType(typeof(ExpandoObject), newExpando["Complex"]);
3789 IDictionary<string, object> o = (ExpandoObject)newExpando["Complex"];
3791 Assert.IsInstanceOfType(typeof(string), o["String"]);
3792 Assert.AreEqual(expando.Complex.String, o["String"]);
3794 Assert.IsInstanceOfType(typeof(DateTime), o["DateTime"]);
3795 Assert.AreEqual(expando.Complex.DateTime, o["DateTime"]);
3800 public void DeserializeDecimalExact()
3802 decimal d = JsonConvert.DeserializeObject<decimal>("123456789876543.21");
3803 Assert.AreEqual(123456789876543.21m, d);
3807 public void DeserializeNullableDecimalExact()
3809 decimal? d = JsonConvert.DeserializeObject<decimal?>("123456789876543.21");
3810 Assert.AreEqual(123456789876543.21m, d);
3814 public void DeserializeDecimalPropertyExact()
3816 string json = "{Amount:123456789876543.21}";
3817 Invoice i = JsonConvert.DeserializeObject<Invoice>(json);
3818 Assert.AreEqual(123456789876543.21m, i.Amount);
3822 public void DeserializeDecimalArrayExact()
3824 string json = "[123456789876543.21]";
3825 IList<decimal> a = JsonConvert.DeserializeObject<IList<decimal>>(json);
3826 Assert.AreEqual(123456789876543.21m, a[0]);
3830 public void DeserializeDecimalDictionaryExact()
3832 string json = "{'Value':123456789876543.21}";
3833 IDictionary<string, decimal> d = JsonConvert.DeserializeObject<IDictionary<string, decimal>>(json);
3834 Assert.AreEqual(123456789876543.21m, d["Value"]);
3837 public struct Vector
3843 public override string ToString()
3845 return string.Format("({0},{1},{2})", X, Y, Z);
3849 public class VectorParent
3851 public Vector Position;
3855 public void DeserializeStructProperty()
3857 VectorParent obj = new VectorParent();
3858 obj.Position = new Vector { X = 1, Y = 2, Z = 3 };
3860 string str = JsonConvert.SerializeObject(obj);
3862 obj = JsonConvert.DeserializeObject<VectorParent>(str);
3864 Assert.AreEqual(1, obj.Position.X);
3865 Assert.AreEqual(2, obj.Position.Y);
3866 Assert.AreEqual(3, obj.Position.Z);
3869 [JsonObject(MemberSerialization.OptIn)]
3870 public class Derived : Base
3873 public string IDoWork { get; private set; }
3875 private Derived() { }
3877 internal Derived(string dontWork, string doWork)
3884 [JsonObject(MemberSerialization.OptIn)]
3888 public string IDontWork { get; private set; }
3890 protected Base() { }
3892 internal Base(string dontWork)
3894 IDontWork = dontWork;
3899 public void PrivateSetterOnBaseClassProperty()
3901 var derived = new Derived("meh", "woo");
3903 var settings = new JsonSerializerSettings
3905 TypeNameHandling = TypeNameHandling.Objects,
3906 ConstructorHandling = ConstructorHandling.AllowNonPublicDefaultConstructor
3909 string json = JsonConvert.SerializeObject(derived, Formatting.Indented, settings);
3911 var meh = JsonConvert.DeserializeObject<Base>(json, settings);
3913 Assert.AreEqual(((Derived)meh).IDoWork, "woo");
3914 Assert.AreEqual(meh.IDontWork, "meh");
3917 #if !(SILVERLIGHT || PocketPC || NET20)
3919 public struct StructISerializable : ISerializable
3921 private string _name;
3923 public StructISerializable(SerializationInfo info, StreamingContext context)
3925 _name = info.GetString("Name");
3931 get { return _name; }
3932 set { _name = value; }
3935 public void GetObjectData(SerializationInfo info, StreamingContext context)
3937 info.AddValue("Name", _name);
3942 public class NullableStructPropertyClass
3944 private StructISerializable _foo1;
3945 private StructISerializable? _foo2;
3948 public StructISerializable Foo1
3950 get { return _foo1; }
3951 set { _foo1 = value; }
3955 public StructISerializable? Foo2
3957 get { return _foo2; }
3958 set { _foo2 = value; }
3963 public void DeserializeNullableStruct()
3965 NullableStructPropertyClass nullableStructPropertyClass = new NullableStructPropertyClass();
3966 nullableStructPropertyClass.Foo1 = new StructISerializable() { Name = "foo 1" };
3967 nullableStructPropertyClass.Foo2 = new StructISerializable() { Name = "foo 2" };
3969 NullableStructPropertyClass barWithNull = new NullableStructPropertyClass();
3970 barWithNull.Foo1 = new StructISerializable() { Name = "foo 1" };
3971 barWithNull.Foo2 = null;
3973 //throws error on deserialization because bar1.Foo2 is of type Foo?
3974 string s = JsonConvert.SerializeObject(nullableStructPropertyClass);
3975 NullableStructPropertyClass deserialized = deserialize(s);
3976 Assert.AreEqual(deserialized.Foo1.Name, "foo 1");
3977 Assert.AreEqual(deserialized.Foo2.Value.Name, "foo 2");
3979 //no error Foo2 is null
3980 s = JsonConvert.SerializeObject(barWithNull);
3981 deserialized = deserialize(s);
3982 Assert.AreEqual(deserialized.Foo1.Name, "foo 1");
3983 Assert.AreEqual(deserialized.Foo2, null);
3987 static NullableStructPropertyClass deserialize(string serStr)
3989 return JsonConvert.DeserializeObject<NullableStructPropertyClass>(
3991 new JsonSerializerSettings
3993 NullValueHandling = NullValueHandling.Ignore,
3994 MissingMemberHandling = MissingMemberHandling.Ignore
3999 public class Response
4001 public string Name { get; set; }
4002 public JToken Data { get; set; }
4006 public void DeserializeJToken()
4008 Response response = new Response
4011 Data = new JObject(new JProperty("First", "Value1"), new JProperty("Second", "Value2"))
4014 string json = JsonConvert.SerializeObject(response, Formatting.Indented);
4016 Response deserializedResponse = JsonConvert.DeserializeObject<Response>(json);
4018 Assert.AreEqual("Success", deserializedResponse.Name);
4019 Assert.IsTrue(deserializedResponse.Data.DeepEquals(response.Data));
4022 public abstract class Test<T>
4024 public abstract T Value { get; set; }
4027 [JsonObject(MemberSerialization.OptIn)]
4028 public class DecimalTest : Test<decimal>
4030 protected DecimalTest() { }
4031 public DecimalTest(decimal val)
4037 public override decimal Value { get; set; }
4041 public void OnError()
4043 var data = new DecimalTest(decimal.MinValue);
4044 var json = JsonConvert.SerializeObject(data);
4045 var obj = JsonConvert.DeserializeObject<DecimalTest>(json);
4047 Assert.AreEqual(decimal.MinValue, obj.Value);
4050 public class NonPublicConstructorWithJsonConstructor
4052 public string Value { get; private set; }
4053 public string Constructor { get; private set; }
4056 private NonPublicConstructorWithJsonConstructor()
4058 Constructor = "NonPublic";
4061 public NonPublicConstructorWithJsonConstructor(string value)
4064 Constructor = "Public Paramatized";
4069 public void NonPublicConstructorWithJsonConstructorTest()
4071 NonPublicConstructorWithJsonConstructor c = JsonConvert.DeserializeObject<NonPublicConstructorWithJsonConstructor>("{}");
4072 Assert.AreEqual("NonPublic", c.Constructor);
4075 public class PublicConstructorOverridenByJsonConstructor
4077 public string Value { get; private set; }
4078 public string Constructor { get; private set; }
4080 public PublicConstructorOverridenByJsonConstructor()
4082 Constructor = "NonPublic";
4086 public PublicConstructorOverridenByJsonConstructor(string value)
4089 Constructor = "Public Paramatized";
4094 public void PublicConstructorOverridenByJsonConstructorTest()
4096 PublicConstructorOverridenByJsonConstructor c = JsonConvert.DeserializeObject<PublicConstructorOverridenByJsonConstructor>("{Value:'value!'}");
4097 Assert.AreEqual("Public Paramatized", c.Constructor);
4098 Assert.AreEqual("value!", c.Value);
4101 public class MultipleParamatrizedConstructorsJsonConstructor
4103 public string Value { get; private set; }
4104 public int Age { get; private set; }
4105 public string Constructor { get; private set; }
4107 public MultipleParamatrizedConstructorsJsonConstructor(string value)
4110 Constructor = "Public Paramatized 1";
4114 public MultipleParamatrizedConstructorsJsonConstructor(string value, int age)
4118 Constructor = "Public Paramatized 2";
4123 public void MultipleParamatrizedConstructorsJsonConstructorTest()
4125 MultipleParamatrizedConstructorsJsonConstructor c = JsonConvert.DeserializeObject<MultipleParamatrizedConstructorsJsonConstructor>("{Value:'value!', Age:1}");
4126 Assert.AreEqual("Public Paramatized 2", c.Constructor);
4127 Assert.AreEqual("value!", c.Value);
4128 Assert.AreEqual(1, c.Age);
4131 public class EnumerableClass
4133 public IEnumerable<string> Enumerable { get; set; }
4137 public void DeserializeEnumerable()
4139 EnumerableClass c = new EnumerableClass
4141 Enumerable = new List<string> { "One", "Two", "Three" }
4144 string json = JsonConvert.SerializeObject(c, Formatting.Indented);
4154 EnumerableClass c2 = JsonConvert.DeserializeObject<EnumerableClass>(json);
4156 Assert.AreEqual("One", c2.Enumerable.ElementAt(0));
4157 Assert.AreEqual("Two", c2.Enumerable.ElementAt(1));
4158 Assert.AreEqual("Three", c2.Enumerable.ElementAt(2));
4161 [JsonObject(MemberSerialization.OptIn)]
4162 public class ItemBase
4165 public string Name { get; set; }
4168 public class ComplexItem : ItemBase
4170 public Stream Source { get; set; }
4174 public void SerializeAttributesOnBase()
4176 ComplexItem i = new ComplexItem();
4178 string json = JsonConvert.SerializeObject(i, Formatting.Indented);
4185 public class DeserializeStringConvert
4187 public string Name { get; set; }
4188 public int Age { get; set; }
4189 public double Height { get; set; }
4190 public decimal Price { get; set; }
4194 public void DeserializeStringEnglish()
4197 'Name': 'James Hughes',
4203 DeserializeStringConvert p = JsonConvert.DeserializeObject<DeserializeStringConvert>(json);
4204 Assert.AreEqual(40, p.Age);
4205 Assert.AreEqual(44.4, p.Height);
4206 Assert.AreEqual(4d, p.Price);
4210 [ExpectedException(typeof(JsonSerializationException), ExpectedMessage = "Error converting value {null} to type 'System.DateTime'.")]
4211 public void DeserializeNullDateTimeValueTest()
4213 JsonConvert.DeserializeObject("null", typeof(DateTime));
4217 public void DeserializeNullNullableDateTimeValueTest()
4219 object dateTime = JsonConvert.DeserializeObject("null", typeof(DateTime?));
4221 Assert.IsNull(dateTime);
4225 public void MultiIndexSuperTest()
4227 MultiIndexSuper e = new MultiIndexSuper();
4229 string json = JsonConvert.SerializeObject(e, Formatting.Indented);
4231 Assert.AreEqual(@"{}", json);
4234 public class MultiIndexSuper : MultiIndexBase
4239 public abstract class MultiIndexBase
4241 protected internal object this[string propertyName]
4243 get { return null; }
4246 protected internal object this[object property]
4248 get { return null; }
4253 public class CommentTestClass
4255 public bool Indexed { get; set; }
4256 public int StartYear { get; set; }
4257 public IList<decimal> Values { get; set; }
4261 public void CommentTestClassTest()
4263 string json = @"{""indexed"":true, ""startYear"":1939, ""values"":
4264 [ 3000, /* 1940-1949 */
4265 3000, 3600, 3600, 3600, 3600, 4200, 4200, 4200, 4200, 4800, /* 1950-1959 */
4266 4800, 4800, 4800, 4800, 4800, 4800, 6600, 6600, 7800, 7800, /* 1960-1969 */
4267 7800, 7800, 9000, 10800, 13200, 14100, 15300, 16500, 17700, 22900, /* 1970-1979 */
4268 25900, 29700, 32400, 35700, 37800, 39600, 42000, 43800, 45000, 48000, /* 1980-1989 */
4269 51300, 53400, 55500, 57600, 60600, 61200, 62700, 65400, 68400, 72600, /* 1990-1999 */
4270 76200, 80400, 84900, 87000, 87900, 90000, 94200, 97500, 102000, 106800, /* 2000-2009 */
4271 106800, 106800] /* 2010-2011 */
4274 CommentTestClass commentTestClass = JsonConvert.DeserializeObject<CommentTestClass>(json);
4276 Assert.AreEqual(true, commentTestClass.Indexed);
4277 Assert.AreEqual(1939, commentTestClass.StartYear);
4278 Assert.AreEqual(63, commentTestClass.Values.Count);
4281 class DTOWithParameterisedConstructor
4283 public DTOWithParameterisedConstructor(string A)
4289 public string A { get; set; }
4290 public int? B { get; set; }
4293 class DTOWithoutParameterisedConstructor
4295 public DTOWithoutParameterisedConstructor()
4300 public string A { get; set; }
4301 public int? B { get; set; }
4305 public void PopulationBehaviourForOmittedPropertiesIsTheSameForParameterisedConstructorAsForDefaultConstructor()
4307 string json = @"{A:""Test""}";
4309 var withoutParameterisedConstructor = JsonConvert.DeserializeObject<DTOWithoutParameterisedConstructor>(json);
4310 var withParameterisedConstructor = JsonConvert.DeserializeObject<DTOWithParameterisedConstructor>(json);
4311 Assert.AreEqual(withoutParameterisedConstructor.B, withParameterisedConstructor.B);