PageRenderTime 62ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 2ms

/modules/JSON/Source/Src/Newtonsoft.Json.Tests/Serialization/JsonSerializerTest.cs

https://bitbucket.org/ipre/calico
C# | 10532 lines | 9489 code | 889 blank | 154 comment | 89 complexity | 1710ae0df72a54210941fb297c9bbcbd MD5 | raw file
Possible License(s): LGPL-2.1, LGPL-3.0, GPL-2.0, GPL-3.0, LGPL-2.0

Large files files are truncated, but you can click here to view the full file

  1. #region License
  2. // Copyright (c) 2007 James Newton-King
  3. //
  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
  11. // conditions:
  12. //
  13. // The above copyright notice and this permission notice shall be
  14. // included in all copies or substantial portions of the Software.
  15. //
  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.
  24. #endregion
  25. using System;
  26. using System.ComponentModel;
  27. #if !(NET35 || NET20 || SILVERLIGHT)
  28. using System.Collections.Concurrent;
  29. #endif
  30. using System.Collections.Generic;
  31. #if !(NET20 || NET35 || SILVERLIGHT || PORTABLE)
  32. using System.Numerics;
  33. #endif
  34. #if !SILVERLIGHT && !NET20 && !NETFX_CORE
  35. using System.ComponentModel.DataAnnotations;
  36. using System.Configuration;
  37. using System.Runtime.CompilerServices;
  38. using System.Runtime.Serialization.Formatters;
  39. using System.Threading;
  40. using System.Web.Script.Serialization;
  41. #endif
  42. using System.Text;
  43. using System.Text.RegularExpressions;
  44. #if !NETFX_CORE
  45. using NUnit.Framework;
  46. #else
  47. using Microsoft.VisualStudio.TestPlatform.UnitTestFramework;
  48. using TestFixture = Microsoft.VisualStudio.TestPlatform.UnitTestFramework.TestClassAttribute;
  49. using Test = Microsoft.VisualStudio.TestPlatform.UnitTestFramework.TestMethodAttribute;
  50. #endif
  51. using Newtonsoft.Json;
  52. using System.IO;
  53. using System.Collections;
  54. using System.Xml;
  55. using System.Xml.Serialization;
  56. using System.Collections.ObjectModel;
  57. using Newtonsoft.Json.Bson;
  58. using Newtonsoft.Json.Linq;
  59. using Newtonsoft.Json.Converters;
  60. #if !NET20
  61. using System.Runtime.Serialization.Json;
  62. #endif
  63. using Newtonsoft.Json.Serialization;
  64. using Newtonsoft.Json.Tests.Linq;
  65. using Newtonsoft.Json.Tests.TestObjects;
  66. using System.Runtime.Serialization;
  67. using System.Globalization;
  68. using Newtonsoft.Json.Utilities;
  69. using System.Reflection;
  70. #if !NET20 && !SILVERLIGHT
  71. using System.Xml.Linq;
  72. using System.Collections.Specialized;
  73. using System.Linq.Expressions;
  74. #endif
  75. #if !(NET35 || NET20)
  76. using System.Dynamic;
  77. #endif
  78. #if NET20
  79. using Newtonsoft.Json.Utilities.LinqBridge;
  80. #else
  81. using System.Linq;
  82. #endif
  83. #if !(SILVERLIGHT || NETFX_CORE)
  84. using System.Drawing;
  85. using System.Diagnostics;
  86. #endif
  87. namespace Newtonsoft.Json.Tests.Serialization
  88. {
  89. [TestFixture]
  90. public class JsonSerializerTest : TestFixtureBase
  91. {
  92. public class GenericItem<T>
  93. {
  94. public T Value { get; set; }
  95. }
  96. public class NonGenericItem : GenericItem<string>
  97. {
  98. }
  99. public class GenericClass<T, TValue> : IEnumerable<T>
  100. where T : GenericItem<TValue>, new()
  101. {
  102. public IList<T> Items { get; set; }
  103. public GenericClass()
  104. {
  105. Items = new List<T>();
  106. }
  107. public IEnumerator<T> GetEnumerator()
  108. {
  109. if (Items != null)
  110. {
  111. foreach (T item in Items)
  112. {
  113. yield return item;
  114. }
  115. }
  116. else
  117. yield break;
  118. }
  119. IEnumerator IEnumerable.GetEnumerator()
  120. {
  121. return GetEnumerator();
  122. }
  123. }
  124. public class NonGenericClass : GenericClass<GenericItem<string>, string>
  125. {
  126. }
  127. #pragma warning disable 169
  128. public class CustomerInvoice
  129. {
  130. // we're only modifing the tax rate
  131. public decimal TaxRate { get; set; }
  132. // everything else gets stored here
  133. [JsonExtensionData]
  134. private IDictionary<string, JToken> _additionalData;
  135. }
  136. #pragma warning restore 169
  137. [Test]
  138. public void ExtensionDataExample()
  139. {
  140. string json = @"{
  141. 'HourlyRate': 150,
  142. 'Hours': 40,
  143. 'TaxRate': 0.125
  144. }";
  145. var invoice = JsonConvert.DeserializeObject<CustomerInvoice>(json);
  146. // increase tax to 15%
  147. invoice.TaxRate = 0.15m;
  148. string result = JsonConvert.SerializeObject(invoice);
  149. // {
  150. // 'TaxRate': 0.15,
  151. // 'HourlyRate': 150,
  152. // 'Hours': 40
  153. // }
  154. Assert.AreEqual(@"{""TaxRate"":0.15,""HourlyRate"":150,""Hours"":40}", result);
  155. }
  156. public class ExtensionDataTestClass
  157. {
  158. public string Name { get; set; }
  159. [JsonProperty("custom_name")]
  160. public string CustomName { get; set; }
  161. [JsonIgnore]
  162. public IList<int> Ignored { get; set; }
  163. public bool GetPrivate { get; internal set; }
  164. public bool GetOnly
  165. {
  166. get { return true; }
  167. }
  168. public readonly string Readonly = "Readonly";
  169. public IList<int> Ints { get; set; }
  170. [JsonExtensionData]
  171. internal IDictionary<string, JToken> ExtensionData { get; set; }
  172. public ExtensionDataTestClass()
  173. {
  174. Ints = new List<int> { 0 };
  175. }
  176. }
  177. public class JObjectExtensionDataTestClass
  178. {
  179. public string Name { get; set; }
  180. [JsonExtensionData]
  181. public JObject ExtensionData { get; set; }
  182. }
  183. [Test]
  184. public void RoundTripJObjectExtensionData()
  185. {
  186. JObjectExtensionDataTestClass c = new JObjectExtensionDataTestClass();
  187. c.Name = "Name!";
  188. c.ExtensionData = new JObject
  189. {
  190. {"one",1},
  191. {"two","II"},
  192. {"three",new JArray(1,1,1)}
  193. };
  194. string json = JsonConvert.SerializeObject(c, Formatting.Indented);
  195. JObjectExtensionDataTestClass c2 = JsonConvert.DeserializeObject<JObjectExtensionDataTestClass>(json);
  196. Assert.AreEqual("Name!", c2.Name);
  197. Assert.IsTrue(JToken.DeepEquals(c.ExtensionData, c2.ExtensionData));
  198. }
  199. [Test]
  200. public void JsonSerializerProperties()
  201. {
  202. JsonSerializer serializer = new JsonSerializer();
  203. DefaultSerializationBinder customBinder = new DefaultSerializationBinder();
  204. serializer.Binder = customBinder;
  205. Assert.AreEqual(customBinder, serializer.Binder);
  206. serializer.CheckAdditionalContent = true;
  207. Assert.AreEqual(true, serializer.CheckAdditionalContent);
  208. serializer.ConstructorHandling = ConstructorHandling.AllowNonPublicDefaultConstructor;
  209. Assert.AreEqual(ConstructorHandling.AllowNonPublicDefaultConstructor, serializer.ConstructorHandling);
  210. #if !NETFX_CORE
  211. serializer.Context = new StreamingContext(StreamingContextStates.Other);
  212. Assert.AreEqual(new StreamingContext(StreamingContextStates.Other), serializer.Context);
  213. #endif
  214. CamelCasePropertyNamesContractResolver resolver = new CamelCasePropertyNamesContractResolver();
  215. serializer.ContractResolver = resolver;
  216. Assert.AreEqual(resolver, serializer.ContractResolver);
  217. serializer.Converters.Add(new StringEnumConverter());
  218. Assert.AreEqual(1, serializer.Converters.Count);
  219. serializer.Culture = new CultureInfo("en-nz");
  220. Assert.AreEqual("en-NZ", serializer.Culture.ToString());
  221. serializer.DateFormatHandling = DateFormatHandling.MicrosoftDateFormat;
  222. Assert.AreEqual(DateFormatHandling.MicrosoftDateFormat, serializer.DateFormatHandling);
  223. serializer.DateFormatString = "yyyy";
  224. Assert.AreEqual("yyyy", serializer.DateFormatString);
  225. serializer.DateParseHandling = DateParseHandling.None;
  226. Assert.AreEqual(DateParseHandling.None, serializer.DateParseHandling);
  227. serializer.DateTimeZoneHandling = DateTimeZoneHandling.Utc;
  228. Assert.AreEqual(DateTimeZoneHandling.Utc, serializer.DateTimeZoneHandling);
  229. serializer.DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate;
  230. Assert.AreEqual(DefaultValueHandling.IgnoreAndPopulate, serializer.DefaultValueHandling);
  231. serializer.FloatFormatHandling = FloatFormatHandling.Symbol;
  232. Assert.AreEqual(FloatFormatHandling.Symbol, serializer.FloatFormatHandling);
  233. serializer.FloatParseHandling = FloatParseHandling.Decimal;
  234. Assert.AreEqual(FloatParseHandling.Decimal, serializer.FloatParseHandling);
  235. serializer.Formatting = Formatting.Indented;
  236. Assert.AreEqual(Formatting.Indented, serializer.Formatting);
  237. serializer.MaxDepth = 9001;
  238. Assert.AreEqual(9001, serializer.MaxDepth);
  239. serializer.MissingMemberHandling = MissingMemberHandling.Error;
  240. Assert.AreEqual(MissingMemberHandling.Error, serializer.MissingMemberHandling);
  241. serializer.NullValueHandling = NullValueHandling.Ignore;
  242. Assert.AreEqual(NullValueHandling.Ignore, serializer.NullValueHandling);
  243. serializer.ObjectCreationHandling = ObjectCreationHandling.Replace;
  244. Assert.AreEqual(ObjectCreationHandling.Replace, serializer.ObjectCreationHandling);
  245. serializer.PreserveReferencesHandling = PreserveReferencesHandling.All;
  246. Assert.AreEqual(PreserveReferencesHandling.All, serializer.PreserveReferencesHandling);
  247. serializer.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
  248. Assert.AreEqual(ReferenceLoopHandling.Ignore, serializer.ReferenceLoopHandling);
  249. IdReferenceResolver referenceResolver = new IdReferenceResolver();
  250. serializer.ReferenceResolver = referenceResolver;
  251. Assert.AreEqual(referenceResolver, serializer.ReferenceResolver);
  252. serializer.StringEscapeHandling = StringEscapeHandling.EscapeNonAscii;
  253. Assert.AreEqual(StringEscapeHandling.EscapeNonAscii, serializer.StringEscapeHandling);
  254. MemoryTraceWriter traceWriter = new MemoryTraceWriter();
  255. serializer.TraceWriter = traceWriter;
  256. Assert.AreEqual(traceWriter, serializer.TraceWriter);
  257. #if !(PORTABLE || PORTABLE40 || NETFX_CORE || NET20)
  258. serializer.TypeNameAssemblyFormat = FormatterAssemblyStyle.Full;
  259. Assert.AreEqual(FormatterAssemblyStyle.Full, serializer.TypeNameAssemblyFormat);
  260. #endif
  261. serializer.TypeNameHandling = TypeNameHandling.All;
  262. Assert.AreEqual(TypeNameHandling.All, serializer.TypeNameHandling);
  263. }
  264. [Test]
  265. public void JsonSerializerSettingsProperties()
  266. {
  267. JsonSerializerSettings settings = new JsonSerializerSettings();
  268. DefaultSerializationBinder customBinder = new DefaultSerializationBinder();
  269. settings.Binder = customBinder;
  270. Assert.AreEqual(customBinder, settings.Binder);
  271. settings.CheckAdditionalContent = true;
  272. Assert.AreEqual(true, settings.CheckAdditionalContent);
  273. settings.ConstructorHandling = ConstructorHandling.AllowNonPublicDefaultConstructor;
  274. Assert.AreEqual(ConstructorHandling.AllowNonPublicDefaultConstructor, settings.ConstructorHandling);
  275. #if !NETFX_CORE
  276. settings.Context = new StreamingContext(StreamingContextStates.Other);
  277. Assert.AreEqual(new StreamingContext(StreamingContextStates.Other), settings.Context);
  278. #endif
  279. CamelCasePropertyNamesContractResolver resolver = new CamelCasePropertyNamesContractResolver();
  280. settings.ContractResolver = resolver;
  281. Assert.AreEqual(resolver, settings.ContractResolver);
  282. settings.Converters.Add(new StringEnumConverter());
  283. Assert.AreEqual(1, settings.Converters.Count);
  284. settings.Culture = new CultureInfo("en-nz");
  285. Assert.AreEqual("en-NZ", settings.Culture.ToString());
  286. settings.DateFormatHandling = DateFormatHandling.MicrosoftDateFormat;
  287. Assert.AreEqual(DateFormatHandling.MicrosoftDateFormat, settings.DateFormatHandling);
  288. settings.DateFormatString = "yyyy";
  289. Assert.AreEqual("yyyy", settings.DateFormatString);
  290. settings.DateParseHandling = DateParseHandling.None;
  291. Assert.AreEqual(DateParseHandling.None, settings.DateParseHandling);
  292. settings.DateTimeZoneHandling = DateTimeZoneHandling.Utc;
  293. Assert.AreEqual(DateTimeZoneHandling.Utc, settings.DateTimeZoneHandling);
  294. settings.DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate;
  295. Assert.AreEqual(DefaultValueHandling.IgnoreAndPopulate, settings.DefaultValueHandling);
  296. settings.FloatFormatHandling = FloatFormatHandling.Symbol;
  297. Assert.AreEqual(FloatFormatHandling.Symbol, settings.FloatFormatHandling);
  298. settings.FloatParseHandling = FloatParseHandling.Decimal;
  299. Assert.AreEqual(FloatParseHandling.Decimal, settings.FloatParseHandling);
  300. settings.Formatting = Formatting.Indented;
  301. Assert.AreEqual(Formatting.Indented, settings.Formatting);
  302. settings.MaxDepth = 9001;
  303. Assert.AreEqual(9001, settings.MaxDepth);
  304. settings.MissingMemberHandling = MissingMemberHandling.Error;
  305. Assert.AreEqual(MissingMemberHandling.Error, settings.MissingMemberHandling);
  306. settings.NullValueHandling = NullValueHandling.Ignore;
  307. Assert.AreEqual(NullValueHandling.Ignore, settings.NullValueHandling);
  308. settings.ObjectCreationHandling = ObjectCreationHandling.Replace;
  309. Assert.AreEqual(ObjectCreationHandling.Replace, settings.ObjectCreationHandling);
  310. settings.PreserveReferencesHandling = PreserveReferencesHandling.All;
  311. Assert.AreEqual(PreserveReferencesHandling.All, settings.PreserveReferencesHandling);
  312. settings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
  313. Assert.AreEqual(ReferenceLoopHandling.Ignore, settings.ReferenceLoopHandling);
  314. IdReferenceResolver referenceResolver = new IdReferenceResolver();
  315. settings.ReferenceResolver = referenceResolver;
  316. Assert.AreEqual(referenceResolver, settings.ReferenceResolver);
  317. settings.StringEscapeHandling = StringEscapeHandling.EscapeNonAscii;
  318. Assert.AreEqual(StringEscapeHandling.EscapeNonAscii, settings.StringEscapeHandling);
  319. MemoryTraceWriter traceWriter = new MemoryTraceWriter();
  320. settings.TraceWriter = traceWriter;
  321. Assert.AreEqual(traceWriter, settings.TraceWriter);
  322. #if !(PORTABLE || PORTABLE40 || NETFX_CORE || NET20)
  323. settings.TypeNameAssemblyFormat = FormatterAssemblyStyle.Full;
  324. Assert.AreEqual(FormatterAssemblyStyle.Full, settings.TypeNameAssemblyFormat);
  325. #endif
  326. settings.TypeNameHandling = TypeNameHandling.All;
  327. Assert.AreEqual(TypeNameHandling.All, settings.TypeNameHandling);
  328. }
  329. [Test]
  330. public void JsonSerializerProxyProperties()
  331. {
  332. JsonSerializerProxy serializerProxy = new JsonSerializerProxy(new JsonSerializerInternalReader(new JsonSerializer()));
  333. DefaultSerializationBinder customBinder = new DefaultSerializationBinder();
  334. serializerProxy.Binder = customBinder;
  335. Assert.AreEqual(customBinder, serializerProxy.Binder);
  336. serializerProxy.CheckAdditionalContent = true;
  337. Assert.AreEqual(true, serializerProxy.CheckAdditionalContent);
  338. serializerProxy.ConstructorHandling = ConstructorHandling.AllowNonPublicDefaultConstructor;
  339. Assert.AreEqual(ConstructorHandling.AllowNonPublicDefaultConstructor, serializerProxy.ConstructorHandling);
  340. #if !NETFX_CORE
  341. serializerProxy.Context = new StreamingContext(StreamingContextStates.Other);
  342. Assert.AreEqual(new StreamingContext(StreamingContextStates.Other), serializerProxy.Context);
  343. #endif
  344. CamelCasePropertyNamesContractResolver resolver = new CamelCasePropertyNamesContractResolver();
  345. serializerProxy.ContractResolver = resolver;
  346. Assert.AreEqual(resolver, serializerProxy.ContractResolver);
  347. serializerProxy.Converters.Add(new StringEnumConverter());
  348. Assert.AreEqual(1, serializerProxy.Converters.Count);
  349. serializerProxy.Culture = new CultureInfo("en-nz");
  350. Assert.AreEqual("en-NZ", serializerProxy.Culture.ToString());
  351. serializerProxy.DateFormatHandling = DateFormatHandling.MicrosoftDateFormat;
  352. Assert.AreEqual(DateFormatHandling.MicrosoftDateFormat, serializerProxy.DateFormatHandling);
  353. serializerProxy.DateFormatString = "yyyy";
  354. Assert.AreEqual("yyyy", serializerProxy.DateFormatString);
  355. serializerProxy.DateParseHandling = DateParseHandling.None;
  356. Assert.AreEqual(DateParseHandling.None, serializerProxy.DateParseHandling);
  357. serializerProxy.DateTimeZoneHandling = DateTimeZoneHandling.Utc;
  358. Assert.AreEqual(DateTimeZoneHandling.Utc, serializerProxy.DateTimeZoneHandling);
  359. serializerProxy.DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate;
  360. Assert.AreEqual(DefaultValueHandling.IgnoreAndPopulate, serializerProxy.DefaultValueHandling);
  361. serializerProxy.FloatFormatHandling = FloatFormatHandling.Symbol;
  362. Assert.AreEqual(FloatFormatHandling.Symbol, serializerProxy.FloatFormatHandling);
  363. serializerProxy.FloatParseHandling = FloatParseHandling.Decimal;
  364. Assert.AreEqual(FloatParseHandling.Decimal, serializerProxy.FloatParseHandling);
  365. serializerProxy.Formatting = Formatting.Indented;
  366. Assert.AreEqual(Formatting.Indented, serializerProxy.Formatting);
  367. serializerProxy.MaxDepth = 9001;
  368. Assert.AreEqual(9001, serializerProxy.MaxDepth);
  369. serializerProxy.MissingMemberHandling = MissingMemberHandling.Error;
  370. Assert.AreEqual(MissingMemberHandling.Error, serializerProxy.MissingMemberHandling);
  371. serializerProxy.NullValueHandling = NullValueHandling.Ignore;
  372. Assert.AreEqual(NullValueHandling.Ignore, serializerProxy.NullValueHandling);
  373. serializerProxy.ObjectCreationHandling = ObjectCreationHandling.Replace;
  374. Assert.AreEqual(ObjectCreationHandling.Replace, serializerProxy.ObjectCreationHandling);
  375. serializerProxy.PreserveReferencesHandling = PreserveReferencesHandling.All;
  376. Assert.AreEqual(PreserveReferencesHandling.All, serializerProxy.PreserveReferencesHandling);
  377. serializerProxy.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
  378. Assert.AreEqual(ReferenceLoopHandling.Ignore, serializerProxy.ReferenceLoopHandling);
  379. IdReferenceResolver referenceResolver = new IdReferenceResolver();
  380. serializerProxy.ReferenceResolver = referenceResolver;
  381. Assert.AreEqual(referenceResolver, serializerProxy.ReferenceResolver);
  382. serializerProxy.StringEscapeHandling = StringEscapeHandling.EscapeNonAscii;
  383. Assert.AreEqual(StringEscapeHandling.EscapeNonAscii, serializerProxy.StringEscapeHandling);
  384. MemoryTraceWriter traceWriter = new MemoryTraceWriter();
  385. serializerProxy.TraceWriter = traceWriter;
  386. Assert.AreEqual(traceWriter, serializerProxy.TraceWriter);
  387. #if !(PORTABLE || PORTABLE40 || NETFX_CORE || NET20)
  388. serializerProxy.TypeNameAssemblyFormat = FormatterAssemblyStyle.Full;
  389. Assert.AreEqual(FormatterAssemblyStyle.Full, serializerProxy.TypeNameAssemblyFormat);
  390. #endif
  391. serializerProxy.TypeNameHandling = TypeNameHandling.All;
  392. Assert.AreEqual(TypeNameHandling.All, serializerProxy.TypeNameHandling);
  393. }
  394. #if !(NETFX_CORE || PORTABLE || PORTABLE40)
  395. [Test]
  396. public void DeserializeISerializableIConvertible()
  397. {
  398. Ratio ratio = new Ratio(2, 1);
  399. string json = JsonConvert.SerializeObject(ratio);
  400. Assert.AreEqual(@"{""n"":2,""d"":1}", json);
  401. Ratio ratio2 = JsonConvert.DeserializeObject<Ratio>(json);
  402. Assert.AreEqual(ratio.Denominator, ratio2.Denominator);
  403. Assert.AreEqual(ratio.Numerator, ratio2.Numerator);
  404. }
  405. #endif
  406. [Test]
  407. public void DeserializeLargeFloat()
  408. {
  409. object o = JsonConvert.DeserializeObject("100000000000000000000000000000000000000.0");
  410. CustomAssert.IsInstanceOfType(typeof(double), o);
  411. Assert.IsTrue(MathUtils.ApproxEquals(1E+38, (double)o));
  412. }
  413. [Test]
  414. public void SerializeDeserializeRegex()
  415. {
  416. Regex regex = new Regex("(hi)", RegexOptions.CultureInvariant);
  417. string json = JsonConvert.SerializeObject(regex, Formatting.Indented);
  418. Regex r2 = JsonConvert.DeserializeObject<Regex>(json);
  419. Assert.AreEqual("(hi)", r2.ToString());
  420. Assert.AreEqual(RegexOptions.CultureInvariant, r2.Options);
  421. }
  422. [Test]
  423. public void ExtensionDataTest()
  424. {
  425. string json = @"{
  426. ""Ints"": [1,2,3],
  427. ""Ignored"": [1,2,3],
  428. ""Readonly"": ""Readonly"",
  429. ""Name"": ""Actually set!"",
  430. ""CustomName"": ""Wrong name!"",
  431. ""GetPrivate"": true,
  432. ""GetOnly"": true,
  433. ""NewValueSimple"": true,
  434. ""NewValueComplex"": [1,2,3]
  435. }";
  436. ExtensionDataTestClass c = JsonConvert.DeserializeObject<ExtensionDataTestClass>(json);
  437. Assert.AreEqual("Actually set!", c.Name);
  438. Assert.AreEqual(4, c.Ints.Count);
  439. Assert.AreEqual("Readonly", (string)c.ExtensionData["Readonly"]);
  440. Assert.AreEqual("Wrong name!", (string)c.ExtensionData["CustomName"]);
  441. Assert.AreEqual(true, (bool)c.ExtensionData["GetPrivate"]);
  442. Assert.AreEqual(true, (bool)c.ExtensionData["GetOnly"]);
  443. Assert.AreEqual(true, (bool)c.ExtensionData["NewValueSimple"]);
  444. Assert.IsTrue(JToken.DeepEquals(new JArray(1, 2, 3), c.ExtensionData["NewValueComplex"]));
  445. Assert.IsTrue(JToken.DeepEquals(new JArray(1, 2, 3), c.ExtensionData["Ignored"]));
  446. Assert.AreEqual(7, c.ExtensionData.Count);
  447. }
  448. public class MultipleExtensionDataAttributesTestClass
  449. {
  450. public string Name { get; set; }
  451. [JsonExtensionData]
  452. internal IDictionary<string, JToken> ExtensionData1 { get; set; }
  453. [JsonExtensionData]
  454. internal IDictionary<string, JToken> ExtensionData2 { get; set; }
  455. }
  456. public class ExtensionDataAttributesInheritanceTestClass : MultipleExtensionDataAttributesTestClass
  457. {
  458. [JsonExtensionData]
  459. internal IDictionary<string, JToken> ExtensionData0 { get; set; }
  460. }
  461. public class FieldExtensionDataAttributeTestClass
  462. {
  463. [JsonExtensionData]
  464. internal IDictionary<object, object> ExtensionData;
  465. }
  466. public class PublicExtensionDataAttributeTestClass
  467. {
  468. public string Name { get; set; }
  469. [JsonExtensionData]
  470. public IDictionary<object, object> ExtensionData;
  471. }
  472. public class PublicNoReadExtensionDataAttributeTestClass
  473. {
  474. public string Name { get; set; }
  475. [JsonExtensionData(ReadData = false)]
  476. public IDictionary<object, object> ExtensionData;
  477. }
  478. public class PublicNoWriteExtensionDataAttributeTestClass
  479. {
  480. public string Name { get; set; }
  481. [JsonExtensionData(WriteData = false)]
  482. public IDictionary<object, object> ExtensionData;
  483. }
  484. public class PublicJTokenExtensionDataAttributeTestClass
  485. {
  486. public string Name { get; set; }
  487. [JsonExtensionData]
  488. public IDictionary<string, JToken> ExtensionData;
  489. }
  490. [Test]
  491. public void DeserializeDirectoryAccount()
  492. {
  493. string json = @"{'DisplayName':'John Smith', 'SAMAccountName':'contoso\\johns'}";
  494. DirectoryAccount account = JsonConvert.DeserializeObject<DirectoryAccount>(json);
  495. Assert.AreEqual("John Smith", account.DisplayName);
  496. Assert.AreEqual("contoso", account.Domain);
  497. Assert.AreEqual("johns", account.UserName);
  498. }
  499. [Test]
  500. public void SerializePublicExtensionData()
  501. {
  502. string json = JsonConvert.SerializeObject(new PublicExtensionDataAttributeTestClass
  503. {
  504. Name = "Name!",
  505. ExtensionData = new Dictionary<object, object>
  506. {
  507. { "Test", 1 }
  508. }
  509. });
  510. Assert.AreEqual(@"{""Name"":""Name!"",""Test"":1}", json);
  511. }
  512. [Test]
  513. public void SerializePublicExtensionDataNull()
  514. {
  515. string json = JsonConvert.SerializeObject(new PublicExtensionDataAttributeTestClass
  516. {
  517. Name = "Name!"
  518. });
  519. Assert.AreEqual(@"{""Name"":""Name!""}", json);
  520. }
  521. [Test]
  522. public void SerializePublicNoWriteExtensionData()
  523. {
  524. string json = JsonConvert.SerializeObject(new PublicNoWriteExtensionDataAttributeTestClass
  525. {
  526. Name = "Name!",
  527. ExtensionData = new Dictionary<object, object>
  528. {
  529. { "Test", 1 }
  530. }
  531. });
  532. Assert.AreEqual(@"{""Name"":""Name!""}", json);
  533. }
  534. [Test]
  535. public void DeserializeNoReadPublicExtensionData()
  536. {
  537. PublicNoReadExtensionDataAttributeTestClass c = JsonConvert.DeserializeObject<PublicNoReadExtensionDataAttributeTestClass>(@"{""Name"":""Name!"",""Test"":1}");
  538. Assert.AreEqual(null, c.ExtensionData);
  539. }
  540. [Test]
  541. public void SerializePublicExtensionDataCircularReference()
  542. {
  543. var c = new PublicExtensionDataAttributeTestClass
  544. {
  545. Name = "Name!",
  546. ExtensionData = new Dictionary<object, object>
  547. {
  548. { "Test", 1 }
  549. }
  550. };
  551. c.ExtensionData["Self"] = c;
  552. string json = JsonConvert.SerializeObject(c, new JsonSerializerSettings
  553. {
  554. PreserveReferencesHandling = PreserveReferencesHandling.All,
  555. Formatting = Formatting.Indented
  556. });
  557. Assert.AreEqual(@"{
  558. ""$id"": ""1"",
  559. ""Name"": ""Name!"",
  560. ""Test"": 1,
  561. ""Self"": {
  562. ""$ref"": ""1""
  563. }
  564. }", json);
  565. var c2 = JsonConvert.DeserializeObject<PublicExtensionDataAttributeTestClass>(json, new JsonSerializerSettings
  566. {
  567. PreserveReferencesHandling = PreserveReferencesHandling.All
  568. });
  569. Assert.AreEqual("Name!", c2.Name);
  570. PublicExtensionDataAttributeTestClass bizzaroC2 = (PublicExtensionDataAttributeTestClass)c2.ExtensionData["Self"];
  571. Assert.AreEqual(c2, bizzaroC2);
  572. Assert.AreEqual(1, (long)bizzaroC2.ExtensionData["Test"]);
  573. }
  574. [Test]
  575. public void DeserializePublicJTokenExtensionDataCircularReference()
  576. {
  577. string json = @"{
  578. ""$id"": ""1"",
  579. ""Name"": ""Name!"",
  580. ""Test"": 1,
  581. ""Self"": {
  582. ""$ref"": ""1""
  583. }
  584. }";
  585. var c2 = JsonConvert.DeserializeObject<PublicJTokenExtensionDataAttributeTestClass>(json, new JsonSerializerSettings
  586. {
  587. PreserveReferencesHandling = PreserveReferencesHandling.All
  588. });
  589. Assert.AreEqual("Name!", c2.Name);
  590. JObject bizzaroC2 = (JObject)c2.ExtensionData["Self"];
  591. Assert.AreEqual("Name!", (string)bizzaroC2["Name"]);
  592. Assert.AreEqual(1, (int)bizzaroC2["Test"]);
  593. Assert.AreEqual(1, (int)c2.ExtensionData["Test"]);
  594. }
  595. [Test]
  596. public void DeserializePublicExtensionDataTypeNamdHandling()
  597. {
  598. string json = @"{
  599. ""$id"": ""1"",
  600. ""Name"": ""Name!"",
  601. ""Test"": 1,
  602. ""Self"": {
  603. ""$type"": ""Newtonsoft.Json.Tests.TestObjects.WagePerson, Newtonsoft.Json.Tests"",
  604. ""HourlyWage"": 2.0,
  605. ""Name"": null,
  606. ""BirthDate"": ""0001-01-01T00:00:00"",
  607. ""LastModified"": ""0001-01-01T00:00:00""
  608. }
  609. }";
  610. PublicExtensionDataAttributeTestClass c2 = JsonConvert.DeserializeObject<PublicExtensionDataAttributeTestClass>(json, new JsonSerializerSettings
  611. {
  612. TypeNameHandling = TypeNameHandling.Objects
  613. });
  614. Assert.AreEqual("Name!", c2.Name);
  615. WagePerson bizzaroC2 = (WagePerson)c2.ExtensionData["Self"];
  616. Assert.AreEqual(2m, bizzaroC2.HourlyWage);
  617. }
  618. [Test]
  619. public void SerializePublicExtensionDataTypeNamdHandling()
  620. {
  621. PublicExtensionDataAttributeTestClass c = new PublicExtensionDataAttributeTestClass
  622. {
  623. Name = "Name!",
  624. ExtensionData = new Dictionary<object, object>
  625. {
  626. {
  627. "Test", new WagePerson
  628. {
  629. HourlyWage = 2.1m
  630. }
  631. }
  632. }
  633. };
  634. string json = JsonConvert.SerializeObject(c, new JsonSerializerSettings
  635. {
  636. TypeNameHandling = TypeNameHandling.Objects,
  637. Formatting = Formatting.Indented
  638. });
  639. Assert.AreEqual(@"{
  640. ""$type"": ""Newtonsoft.Json.Tests.Serialization.JsonSerializerTest+PublicExtensionDataAttributeTestClass, Newtonsoft.Json.Tests"",
  641. ""Name"": ""Name!"",
  642. ""Test"": {
  643. ""$type"": ""Newtonsoft.Json.Tests.TestObjects.WagePerson, Newtonsoft.Json.Tests"",
  644. ""HourlyWage"": 2.1,
  645. ""Name"": null,
  646. ""BirthDate"": ""0001-01-01T00:00:00"",
  647. ""LastModified"": ""0001-01-01T00:00:00""
  648. }
  649. }", json);
  650. }
  651. [Test]
  652. public void DeserializePublicExtensionData()
  653. {
  654. string json = @"{
  655. 'Name':'Name!',
  656. 'NoMatch':'NoMatch!',
  657. 'ExtensionData':{'HAI':true}
  658. }";
  659. var c = JsonConvert.DeserializeObject<PublicExtensionDataAttributeTestClass>(json);
  660. Assert.AreEqual("Name!", c.Name);
  661. Assert.AreEqual(2, c.ExtensionData.Count);
  662. Assert.AreEqual("NoMatch!", (string)c.ExtensionData["NoMatch"]);
  663. // the ExtensionData property is put into the extension data
  664. // inception
  665. var o = (JObject)c.ExtensionData["ExtensionData"];
  666. Assert.AreEqual(1, o.Count);
  667. Assert.IsTrue(JToken.DeepEquals(new JObject { { "HAI", true } }, o));
  668. }
  669. [Test]
  670. public void FieldExtensionDataAttributeTest_Serialize()
  671. {
  672. FieldExtensionDataAttributeTestClass c = new FieldExtensionDataAttributeTestClass
  673. {
  674. ExtensionData = new Dictionary<object, object>()
  675. };
  676. string json = JsonConvert.SerializeObject(c);
  677. Assert.AreEqual("{}", json);
  678. }
  679. [Test]
  680. public void FieldExtensionDataAttributeTest_Deserialize()
  681. {
  682. var c = JsonConvert.DeserializeObject<FieldExtensionDataAttributeTestClass>("{'first':1,'second':2}");
  683. Assert.AreEqual(2, c.ExtensionData.Count);
  684. Assert.AreEqual(1, (long)c.ExtensionData["first"]);
  685. Assert.AreEqual(2, (long)c.ExtensionData["second"]);
  686. }
  687. [Test]
  688. public void MultipleExtensionDataAttributesTest()
  689. {
  690. var c = JsonConvert.DeserializeObject<MultipleExtensionDataAttributesTestClass>("{'first':[1],'second':[2]}");
  691. Assert.AreEqual(null, c.ExtensionData1);
  692. Assert.AreEqual(2, c.ExtensionData2.Count);
  693. Assert.AreEqual(1, (int)((JArray)c.ExtensionData2["first"])[0]);
  694. Assert.AreEqual(2, (int)((JArray)c.ExtensionData2["second"])[0]);
  695. }
  696. [Test]
  697. public void ExtensionDataAttributesInheritanceTest()
  698. {
  699. var c = JsonConvert.DeserializeObject<ExtensionDataAttributesInheritanceTestClass>("{'first':1,'second':2}");
  700. Assert.AreEqual(null, c.ExtensionData1);
  701. Assert.AreEqual(null, c.ExtensionData2);
  702. Assert.AreEqual(2, c.ExtensionData0.Count);
  703. Assert.AreEqual(1, (int)c.ExtensionData0["first"]);
  704. Assert.AreEqual(2, (int)c.ExtensionData0["second"]);
  705. }
  706. [Test]
  707. public void GenericCollectionInheritance()
  708. {
  709. string json;
  710. GenericClass<GenericItem<string>, string> foo1 = new GenericClass<GenericItem<string>, string>();
  711. foo1.Items.Add(new GenericItem<string> {Value = "Hello"});
  712. json = JsonConvert.SerializeObject(new {selectList = foo1});
  713. Assert.AreEqual(@"{""selectList"":[{""Value"":""Hello""}]}", json);
  714. GenericClass<NonGenericItem, string> foo2 = new GenericClass<NonGenericItem, string>();
  715. foo2.Items.Add(new NonGenericItem {Value = "Hello"});
  716. json = JsonConvert.SerializeObject(new { selectList = foo2 });
  717. Assert.AreEqual(@"{""selectList"":[{""Value"":""Hello""}]}", json);
  718. NonGenericClass foo3 = new NonGenericClass();
  719. foo3.Items.Add(new NonGenericItem {Value = "Hello"});
  720. json = JsonConvert.SerializeObject(new { selectList = foo3 });
  721. Assert.AreEqual(@"{""selectList"":[{""Value"":""Hello""}]}", json);
  722. }
  723. #if !NET20
  724. [DataContract]
  725. public class BaseDataContractWithHidden
  726. {
  727. [DataMember(Name = "virtualMember")]
  728. public virtual string VirtualMember { get; set; }
  729. [DataMember(Name = "nonVirtualMember")]
  730. public string NonVirtualMember { get; set; }
  731. public virtual object NewMember { get; set; }
  732. }
  733. public class ChildDataContractWithHidden : BaseDataContractWithHidden
  734. {
  735. [DataMember(Name = "NewMember")]
  736. public virtual new string NewMember { get; set; }
  737. public override string VirtualMember { get; set; }
  738. public string AddedMember { get; set; }
  739. }
  740. [Test]
  741. public void ChildDataContractTestWithHidden()
  742. {
  743. var cc = new ChildDataContractWithHidden
  744. {
  745. VirtualMember = "VirtualMember!",
  746. NonVirtualMember = "NonVirtualMember!",
  747. NewMember = "NewMember!"
  748. };
  749. string result = JsonConvert.SerializeObject(cc);
  750. Assert.AreEqual(@"{""NewMember"":""NewMember!"",""virtualMember"":""VirtualMember!"",""nonVirtualMember"":""NonVirtualMember!""}", result);
  751. }
  752. // ignore hiding members compiler warning
  753. #pragma warning disable 108,114
  754. [DataContract]
  755. public class BaseWithContract
  756. {
  757. [DataMember(Name = "VirtualWithDataMemberBase")]
  758. public virtual string VirtualWithDataMember { get; set; }
  759. [DataMember]
  760. public virtual string Virtual { get; set; }
  761. [DataMember(Name = "WithDataMemberBase")]
  762. public string WithDataMember { get; set; }
  763. [DataMember]
  764. public string JustAProperty { get; set; }
  765. }
  766. [DataContract]
  767. public class BaseWithoutContract
  768. {
  769. [DataMember(Name = "VirtualWithDataMemberBase")]
  770. public virtual string VirtualWithDataMember { get; set; }
  771. [DataMember]
  772. public virtual string Virtual { get; set; }
  773. [DataMember(Name = "WithDataMemberBase")]
  774. public string WithDataMember { get; set; }
  775. [DataMember]
  776. public string JustAProperty { get; set; }
  777. }
  778. [DataContract]
  779. public class SubWithoutContractNewProperties : BaseWithContract
  780. {
  781. [DataMember(Name = "VirtualWithDataMemberSub")]
  782. public string VirtualWithDataMember { get; set; }
  783. public string Virtual { get; set; }
  784. [DataMember(Name = "WithDataMemberSub")]
  785. public string WithDataMember { get; set; }
  786. public string JustAProperty { get; set; }
  787. }
  788. [DataContract]
  789. public class SubWithoutContractVirtualProperties : BaseWithContract
  790. {
  791. public override string VirtualWithDataMember { get; set; }
  792. [DataMember(Name = "VirtualSub")]
  793. public override string Virtual { get; set; }
  794. }
  795. [DataContract]
  796. public class SubWithContractNewProperties : BaseWithContract
  797. {
  798. [DataMember(Name = "VirtualWithDataMemberSub")]
  799. public string VirtualWithDataMember { get; set; }
  800. [DataMember(Name = "Virtual2")]
  801. public string Virtual { get; set; }
  802. [DataMember(Name = "WithDataMemberSub")]
  803. public string WithDataMember { get; set; }
  804. [DataMember(Name = "JustAProperty2")]
  805. public string JustAProperty { get; set; }
  806. }
  807. [DataContract]
  808. public class SubWithContractVirtualProperties : BaseWithContract
  809. {
  810. [DataMember(Name = "VirtualWithDataMemberSub")]
  811. public virtual string VirtualWithDataMember { get; set; }
  812. }
  813. #pragma warning restore 108,114
  814. [Test]
  815. public void SubWithoutContractNewPropertiesTest()
  816. {
  817. BaseWithContract baseWith = new SubWithoutContractNewProperties
  818. {
  819. JustAProperty = "JustAProperty!",
  820. Virtual = "Virtual!",
  821. VirtualWithDataMember = "VirtualWithDataMember!",
  822. WithDataMember = "WithDataMember!"
  823. };
  824. baseWith.JustAProperty = "JustAProperty2!";
  825. baseWith.Virtual = "Virtual2!";
  826. baseWith.VirtualWithDataMember = "VirtualWithDataMember2!";
  827. baseWith.WithDataMember = "WithDataMember2!";
  828. string json = AssertSerializeDeserializeEqual(baseWith);
  829. Assert.AreEqual(@"{
  830. ""JustAProperty"": ""JustAProperty2!"",
  831. ""Virtual"": ""Virtual2!"",
  832. ""VirtualWithDataMemberBase"": ""VirtualWithDataMember2!"",
  833. ""VirtualWithDataMemberSub"": ""VirtualWithDataMember!"",
  834. ""WithDataMemberBase"": ""WithDataMember2!"",
  835. ""WithDataMemberSub"": ""WithDataMember!""
  836. }", json);
  837. }
  838. [Test]
  839. public void SubWithoutContractVirtualPropertiesTest()
  840. {
  841. BaseWithContract baseWith = new SubWithoutContractVirtualProperties
  842. {
  843. JustAProperty = "JustAProperty!",
  844. Virtual = "Virtual!",
  845. VirtualWithDataMember = "VirtualWithDataMember!",
  846. WithDataMember = "WithDataMember!"
  847. };
  848. baseWith.JustAProperty = "JustAProperty2!";
  849. baseWith.Virtual = "Virtual2!";
  850. baseWith.VirtualWithDataMember = "VirtualWithDataMember2!";
  851. baseWith.WithDataMember = "WithDataMember2!";
  852. string json = JsonConvert.SerializeObject(baseWith, Formatting.Indented);
  853. Console.WriteLine(json);
  854. Assert.AreEqual(@"{
  855. ""VirtualWithDataMemberBase"": ""VirtualWithDataMember2!"",
  856. ""VirtualSub"": ""Virtual2!"",
  857. ""WithDataMemberBase"": ""WithDataMember2!"",
  858. ""JustAProperty"": ""JustAProperty2!""
  859. }", json);
  860. }
  861. [Test]
  862. public void SubWithContractNewPropertiesTest()
  863. {
  864. BaseWithContract baseWith = new SubWithContractNewProperties
  865. {
  866. JustAProperty = "JustAProperty!",
  867. Virtual = "Virtual!",
  868. VirtualWithDataMember = "VirtualWithDataMember!",
  869. WithDataMember = "WithDataMember!"
  870. };
  871. baseWith.JustAProperty = "JustAProperty2!";
  872. baseWith.Virtual = "Virtual2!";
  873. baseWith.VirtualWithDataMember = "VirtualWithDataMember2!";
  874. baseWith.WithDataMember = "WithDataMember2!";
  875. string json = AssertSerializeDeserializeEqual(baseWith);
  876. Assert.AreEqual(@"{
  877. ""JustAProperty"": ""JustAProperty2!"",
  878. ""JustAProperty2"": ""JustAProperty!"",
  879. ""Virtual"": ""Virtual2!"",
  880. ""Virtual2"": ""Virtual!"",
  881. ""VirtualWithDataMemberBase"": ""VirtualWithDataMember2!"",
  882. ""VirtualWithDataMemberSub"": ""VirtualWithDataMember!"",
  883. ""WithDataMemberBase"": ""WithDataMember2!"",
  884. ""WithDataMemberSub"": ""WithDataMember!""
  885. }", json);
  886. }
  887. [Test]
  888. public void SubWithContractVirtualPropertiesTest()
  889. {
  890. BaseWithContract baseWith = new SubWithContractVirtualProperties
  891. {
  892. JustAProperty = "JustAProperty!",
  893. Virtual = "Virtual!",
  894. VirtualWithDataMember = "VirtualWithDataMember!",
  895. WithDataMember = "WithDataMember!"
  896. };
  897. baseWith.JustAProperty = "JustAProperty2!";
  898. baseWith.Virtual = "Virtual2!";
  899. baseWith.VirtualWithDataMember = "VirtualWithDataMember2!";
  900. baseWith.WithDataMember = "WithDataMember2!";
  901. string json = AssertSerializeDeserializeEqual(baseWith);
  902. Assert.AreEqual(@"{
  903. ""JustAProperty"": ""JustAProperty2!"",
  904. ""Virtual"": ""Virtual2!"",
  905. ""VirtualWithDataMemberBase"": ""VirtualWithDataMember2!"",
  906. ""VirtualWithDataMemberSub"": ""VirtualWithDataMember!"",
  907. ""WithDataMemberBase"": ""WithDataMember2!""
  908. }", json);
  909. }
  910. private string AssertSerializeDeserializeEqual(object o)
  911. {
  912. MemoryStream ms = new MemoryStream();
  913. DataContractJsonSerializer s = new DataContractJsonSerializer(o.GetType());
  914. s.WriteObject(ms, o);
  915. var data = ms.ToArray();
  916. JObject dataContractJson = JObject.Parse(Encoding.UTF8.GetString(data, 0, data.Length));
  917. dataContractJson = new JObject(dataContractJson.Properties().OrderBy(p => p.Name));
  918. JObject jsonNetJson = JObject.Parse(JsonConvert.SerializeObject(o));
  919. jsonNetJson = new JObject(jsonNetJson.Properties().OrderBy(p => p.Name));
  920. Console.WriteLine("Results for " + o.GetType().Name);
  921. Console.WriteLine("DataContractJsonSerializer: " + dataContractJson);
  922. Console.WriteLine("JsonDotNetSerializer : " + jsonNetJson);
  923. Assert.AreEqual(dataContractJson.Count, jsonNetJson.Count);
  924. foreach (KeyValuePair<string, JToken> property in dataContractJson)
  925. {
  926. Assert.IsTrue(JToken.DeepEquals(jsonNetJson[property.Key], property.Value), "Property not equal: " + property.Key);
  927. }
  928. return jsonNetJson.ToString();
  929. }
  930. #endif
  931. [Test]
  932. public void PersonTypedObjectDeserialization()
  933. {
  934. Store store = new Store();
  935. string jsonText = JsonConvert.SerializeObject(store);
  936. Store deserializedStore = (Store)JsonConvert.DeserializeObject(jsonText, typeof(Store));
  937. Assert.AreEqual(store.Establised, deserializedStore.Establised);
  938. Assert.AreEqual(store.product.Count, deserializedStore.product.Count);
  939. Console.WriteLine(jsonText);
  940. }
  941. [Test]
  942. public void TypedObjectDeserialization()
  943. {
  944. Product product = new Product();
  945. product.Name = "Apple";
  946. product.ExpiryDate = new DateTime(2008, 12, 28);
  947. product.Price = 3.99M;
  948. product.Sizes = new string[] { "Small", "Medium", "Large" };
  949. string output = JsonConvert.SerializeObject(product);
  950. //{
  951. // "Name": "Apple",
  952. // "ExpiryDate": "\/Date(1230375600000+1300)\/",
  953. // "Price": 3.99,
  954. // "Sizes": [
  955. // "Small",
  956. // "Medium",
  957. // "Large"
  958. // ]
  959. //}
  960. Product deserializedProduct = (Product)JsonConvert.DeserializeObject(output, typeof(Product));
  961. Assert.AreEqual("Apple", deserializedProduct.Name);
  962. Assert.AreEqual(new DateTime(2008, 12, 28), deserializedProduct.ExpiryDate);
  963. Assert.AreEqual(3.99m, deserializedProduct.Price);
  964. Assert.AreEqual("Small", deserializedProduct.Sizes[0]);
  965. Assert.AreEqual("Medium", deserializedProduct.Sizes[1]);
  966. Assert.AreEqual("Large", deserializedProduct.Sizes[2]);
  967. }
  968. //[Test]
  969. //public void Advanced()
  970. //{
  971. // Product product = new Product();
  972. // product.ExpiryDate = new DateTime(2008, 12, 28);
  973. // JsonSerializer serializer = new JsonSerializer();
  974. // serializer.Converters.Add(new JavaScriptDateTimeConverter());
  975. // serializer.NullValueHandling = NullValueHandling.Ignore;
  976. // using (StreamWriter sw = new StreamWriter(@"c:\json.txt"))
  977. // using (JsonWriter writer = new JsonTextWriter(sw))
  978. // {
  979. // serializer.Serialize(writer, product);
  980. // // {"ExpiryDate":new Date(1230375600000),"Price":0}
  981. // }
  982. //}
  983. [Test]
  984. public void JsonConvertSerializer()
  985. {
  986. string value = @"{""Name"":""Orange"", ""Price"":3.99, ""ExpiryDate"":""01/24/2010 12:00:00""}";
  987. Product p = JsonConvert.DeserializeObject(value, typeof(Product)) as Product;
  988. Assert.AreEqual("Orange", p.Name);
  989. Assert.AreEqual(new DateTime(2010, 1, 24, 12, 0, 0), p.ExpiryDate);
  990. Assert.AreEqual(3.99m, p.Price);
  991. }
  992. [Test]
  993. public void DeserializeJavaScriptDate()
  994. {
  995. DateTime dateValue = new DateTime(2010, 3, 30);
  996. Dictionary<string, object> testDictionary = new Dictionary<string, object>();
  997. testDictionary["date"] = dateValue;
  998. string jsonText = JsonConvert.SerializeObject(testDictionary);
  999. #if !NET20
  1000. MemoryStream ms = new MemoryStream();
  1001. DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(Dictionary<string, object>));
  1002. serializer.WriteObject(ms, testDictionary);
  1003. byte[] data = ms.ToArray();
  1004. string output = Encoding.UTF8.GetString(data, 0, data.Length);
  1005. #endif
  1006. Dictionary<string, object> deserializedDictionary = (Dictionary<string, object>)JsonConvert.DeserializeObject(jsonText, typeof(Dictionary<string, object>));
  1007. DateTime deserializedDate = (DateTime)deserializedDictionary["date"];
  1008. Assert.AreEqual(dateValue, deserializedDate);
  1009. }
  1010. [Test]
  1011. public void TestMethodExecutorObject()
  1012. {
  1013. MethodExecutorObject executorObject = new MethodExecutorObject();
  1014. executorObject.serverClassName = "BanSubs";
  1015. executorObject.serverMethodParams = new object[] { "21321546", "101", "1236", "D:\\1.txt" };
  1016. executorObject.clientGetResultFunction = "ClientBanSubsCB";
  1017. string output = JsonConvert.SerializeObject(executorObject);
  1018. MethodExecutorObject executorObject2 = JsonConvert.DeserializeObject(output, typeof(MethodExecutorObject)) as MethodExecutorObject;
  1019. Assert.AreNotSame(executorObject, executorObject2);
  1020. Assert.AreEqual(executorObject2.serverClassName, "BanSubs");
  1021. Assert.AreEqual(executorObject2.serverMethodParams.Length, 4);
  1022. CustomAssert.Contains(executorObject2.serverMethodParams, "101");
  1023. Assert.AreEqual(executorObject2.clientGetResultFunction, "ClientBanSubsCB");
  1024. }
  1025. #if !SILVERLIGHT && !NETFX_CORE
  1026. [Test]
  1027. public void HashtableDeserialization()
  1028. {
  1029. string value = @"{""Name"":""Orange"", ""Price"":3.99, ""ExpiryDate"":""01/24/2010 12:00:00""}";
  1030. Hashtable p = JsonConvert.DeserializeObject(value, typeof(Hashtable)) as Hashtable;
  1031. Assert.AreEqual("Orange", p["Name"].ToString());
  1032. }
  1033. [Test]
  1034. public void TypedHashtableDeserialization()
  1035. {
  1036. string value = @"{""Name"":""Orange"", ""Hash"":{""ExpiryDate"":""01/24/2010 12:00:00"",""UntypedArray"":[""01/24/2010 12:00:00""]}}";
  1037. TypedSubHashtable p = JsonConvert.DeserializeObject(value, typeof(TypedSubHashtable)) as TypedSubHashtable;
  1038. Assert.AreEqual("01/24/2010 12:00:00", p.Hash["ExpiryDate"].ToString());
  1039. Assert.AreEqual(@"[
  1040. ""01/24/2010 12:00:00""
  1041. ]", p.Hash["UntypedArray"].ToString());
  1042. }
  1043. #endif
  1044. [Test]
  1045. public void SerializeDeserializeGetOnlyProperty()
  1046. {
  1047. string value = JsonConvert.SerializeObject(new GetOnlyPropertyClass());
  1048. GetOnlyPropertyClass c = JsonConvert.DeserializeObject<GetOnlyPropertyClass>(value);
  1049. Assert.AreEqual(c.Field, "Field");
  1050. Assert.AreEqual(c.GetOnlyProperty, "GetOnlyProperty");
  1051. }
  1052. [Test]
  1053. public void SerializeDeserializeSetOnlyProperty()
  1054. {
  1055. string value = JsonConvert.SerializeObject(new SetOnlyPropertyClass());
  1056. SetOnlyPropertyClass c = JsonConvert.DeserializeObject<SetOnlyPropertyClass>(value);
  1057. Assert.AreEqual(c.Field, "Field");
  1058. }
  1059. [Test]
  1060. public void JsonIgnoreAttributeTest()
  1061. {
  1062. string json = JsonConvert.SerializeObject(new JsonIgnoreAttributeTestClass());
  1063. Assert.AreEqual(@"{""Field"":0,""Property"":21}", json);
  1064. JsonIgnoreAttributeTestClass c = JsonConvert.DeserializeObject<JsonIgnoreAttributeTestClass>(@"{""Field"":99,""Property"":-1,""IgnoredField"":-1,""IgnoredObject"":[1,2,3,4,5]}");
  1065. Assert.AreEqual(0, c.IgnoredField);
  1066. Assert.AreEqual(99, c.Field);
  1067. }
  1068. [Test]
  1069. public void GoogleSearchAPI()
  1070. {
  1071. string json = @"{
  1072. results:
  1073. [
  1074. {
  1075. GsearchResultClass:""GwebSearch"",
  1076. unescapedUrl : ""http://www.google.com/"",
  1077. url : ""http://www.google.com/"",
  1078. visibleUrl : ""www.google.com"",
  1079. cacheUrl :
  1080. ""http://www.google.com/search?q=cache:zhool8dxBV4J:www.google.com"",
  1081. title : ""Google"",
  1082. titleNoFormatting : ""Google"",
  1083. content : ""Enables users to search the Web, Usenet, and
  1084. images. Features include PageRank, caching and translation of
  1085. results, and an option to find similar pages.""
  1086. },
  1087. {
  1088. GsearchResultClass:""GwebSearch"",
  1089. unescapedUrl : ""http://news.google.com/"",
  1090. url : ""http://news.google.com/"",
  1091. visibleUrl : ""news.google.com"",
  1092. cacheUrl :
  1093. ""http://www.google.com/search?q=cache:Va_XShOz_twJ:news.google.com"",
  1094. title : ""Google News"",
  1095. titleNoFormatting : ""Google News"",
  1096. content : ""Aggregated headlines and a search engine of many of the world's news sources.""
  1097. },
  1098. {
  1099. GsearchResultClass:""GwebSearch"",
  1100. unescapedUrl : ""http://groups.google.com/"",
  1101. url : ""http://groups.google.com/"",
  1102. visibleUrl : ""groups.google.com"",
  1103. cacheUrl :
  1104. ""http://www.google.com/search?q=cache:x2uPD3hfkn0J:groups.google.com"",
  1105. title : ""Google Groups"",
  1106. titleNoFormatting : ""Google Groups"",
  1107. content : ""Enables users to search and browse the Usenet
  1108. archives which consist of over 700 million messages, and post new
  1109. comments.""
  1110. },
  1111. {
  1112. GsearchResultClass:""GwebSearch"",
  1113. unescapedUrl : ""http://maps.google.com/"",
  1114. url : ""http://maps.google.com/"",
  1115. visibleUrl : ""maps.google.com"",
  1116. cacheUrl :
  1117. ""http://www.google.com/search?q=cache:dkf5u2twBXIJ:maps.google.com"",
  1118. title : ""Google Maps"",
  1119. titleNoFormatting : ""Google Maps"",
  1120. content : ""Provides directions, interactive maps, and
  1121. satellite/aerial imagery of the United States. Can also search by
  1122. keyword such as type of business.""
  1123. }
  1124. ],
  1125. adResults:
  1126. [
  1127. {
  1128. GsearchResultClass:""GwebSearch.ad"",
  1129. title : ""Gartner Symposium/ITxpo"",
  1130. content1 : ""Meet brilliant Gartner IT analysts"",
  1131. content2 : ""20-23 May 2007- Barcelona, Spain"",
  1132. url :
  1133. ""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="",
  1134. impressionUrl :
  1135. ""http://www.google.com/uds/css/ad-indicator-on.gif?ai=BVualExYGRo3hD5ianAPJvejjD8-s6ye7kdTwArbI4gTAlrECEAEYASDXtMMFOAFQubWAjvr_____AWDXw_4EiAEBmAEAyAEBgAIB"",
  1136. unescapedUrl :
  1137. ""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="",
  1138. visibleUrl : ""www.gartner.com""
  1139. }
  1140. ]
  1141. }
  1142. ";
  1143. object o = JsonConvert.DeserializeObject(json);
  1144. string s = string.Empty;
  1145. s += s;
  1146. }
  1147. [Test]
  1148. public void TorrentDeserializeTest()
  1149. {
  1150. string jsonText = @"{
  1151. """":"""",
  1152. ""label"": [
  1153. [""SomeName"",6]
  1154. ],
  1155. ""torrents"": [
  1156. [""192D99A5C943555CB7F00A852821CF6D6DB3008A"",201,""filename.av

Large files files are truncated, but you can click here to view the full file