PageRenderTime 59ms CodeModel.GetById 21ms RepoModel.GetById 1ms app.codeStats 0ms

/generator/ServiceClientGeneratorLib/ThirdParty/Json/JsonMapper.cs

https://gitlab.com/vectorci/aws-sdk-net
C# | 918 lines | 687 code | 211 blank | 20 comment | 119 complexity | 57c5a38d2acc3221e7596029170c1718 MD5 | raw file
  1. #pragma warning disable 1587
  2. #region Header
  3. ///
  4. /// JsonMapper.cs
  5. /// JSON to .Net object and object to JSON conversions.
  6. ///
  7. /// The authors disclaim copyright to this source code. For more details, see
  8. /// the COPYING file included with this distribution.
  9. ///
  10. #endregion
  11. using System;
  12. using System.Collections;
  13. using System.Collections.Generic;
  14. using System.Globalization;
  15. using System.IO;
  16. using System.Reflection;
  17. namespace Json.LitJson
  18. {
  19. internal struct PropertyMetadata
  20. {
  21. public MemberInfo Info;
  22. public bool IsField;
  23. public Type Type;
  24. }
  25. internal struct ArrayMetadata
  26. {
  27. private Type element_type;
  28. private bool is_array;
  29. private bool is_list;
  30. public Type ElementType {
  31. get {
  32. if (element_type == null)
  33. return typeof (JsonData);
  34. return element_type;
  35. }
  36. set { element_type = value; }
  37. }
  38. public bool IsArray {
  39. get { return is_array; }
  40. set { is_array = value; }
  41. }
  42. public bool IsList {
  43. get { return is_list; }
  44. set { is_list = value; }
  45. }
  46. }
  47. internal struct ObjectMetadata
  48. {
  49. private Type element_type;
  50. private bool is_dictionary;
  51. private IDictionary<string, PropertyMetadata> properties;
  52. public Type ElementType {
  53. get {
  54. if (element_type == null)
  55. return typeof (JsonData);
  56. return element_type;
  57. }
  58. set { element_type = value; }
  59. }
  60. public bool IsDictionary {
  61. get { return is_dictionary; }
  62. set { is_dictionary = value; }
  63. }
  64. public IDictionary<string, PropertyMetadata> Properties {
  65. get { return properties; }
  66. set { properties = value; }
  67. }
  68. }
  69. internal delegate void ExporterFunc (object obj, JsonWriter writer);
  70. public delegate void ExporterFunc<T> (T obj, JsonWriter writer);
  71. internal delegate object ImporterFunc (object input);
  72. public delegate TValue ImporterFunc<TJson, TValue> (TJson input);
  73. public delegate IJsonWrapper WrapperFactory ();
  74. public class JsonMapper
  75. {
  76. #region Fields
  77. private static int max_nesting_depth;
  78. private static IFormatProvider datetime_format;
  79. private static IDictionary<Type, ExporterFunc> base_exporters_table;
  80. private static IDictionary<Type, ExporterFunc> custom_exporters_table;
  81. private static IDictionary<Type,
  82. IDictionary<Type, ImporterFunc>> base_importers_table;
  83. private static IDictionary<Type,
  84. IDictionary<Type, ImporterFunc>> custom_importers_table;
  85. private static IDictionary<Type, ArrayMetadata> array_metadata;
  86. private static readonly object array_metadata_lock = new Object ();
  87. private static IDictionary<Type,
  88. IDictionary<Type, MethodInfo>> conv_ops;
  89. private static readonly object conv_ops_lock = new Object ();
  90. private static IDictionary<Type, ObjectMetadata> object_metadata;
  91. private static readonly object object_metadata_lock = new Object ();
  92. private static IDictionary<Type,
  93. IList<PropertyMetadata>> type_properties;
  94. private static readonly object type_properties_lock = new Object ();
  95. private static JsonWriter static_writer;
  96. private static readonly object static_writer_lock = new Object ();
  97. #endregion
  98. #region Constructors
  99. static JsonMapper ()
  100. {
  101. max_nesting_depth = 100;
  102. array_metadata = new Dictionary<Type, ArrayMetadata> ();
  103. conv_ops = new Dictionary<Type, IDictionary<Type, MethodInfo>> ();
  104. object_metadata = new Dictionary<Type, ObjectMetadata> ();
  105. type_properties = new Dictionary<Type,
  106. IList<PropertyMetadata>> ();
  107. static_writer = new JsonWriter ();
  108. datetime_format = DateTimeFormatInfo.InvariantInfo;
  109. base_exporters_table = new Dictionary<Type, ExporterFunc> ();
  110. custom_exporters_table = new Dictionary<Type, ExporterFunc> ();
  111. base_importers_table = new Dictionary<Type,
  112. IDictionary<Type, ImporterFunc>> ();
  113. custom_importers_table = new Dictionary<Type,
  114. IDictionary<Type, ImporterFunc>> ();
  115. RegisterBaseExporters ();
  116. RegisterBaseImporters ();
  117. }
  118. #endregion
  119. #region Private Methods
  120. private static void AddArrayMetadata (Type type)
  121. {
  122. if (array_metadata.ContainsKey (type))
  123. return;
  124. ArrayMetadata data = new ArrayMetadata ();
  125. data.IsArray = type.IsArray;
  126. if (type.GetInterface("System.Collections.IList") != null)
  127. data.IsList = true;
  128. foreach (PropertyInfo p_info in type.GetProperties())
  129. {
  130. if (p_info.Name != "Item")
  131. continue;
  132. ParameterInfo[] parameters = p_info.GetIndexParameters ();
  133. if (parameters.Length != 1)
  134. continue;
  135. if (parameters[0].ParameterType == typeof (int))
  136. data.ElementType = p_info.PropertyType;
  137. }
  138. lock (array_metadata_lock) {
  139. try {
  140. array_metadata.Add (type, data);
  141. } catch (ArgumentException) {
  142. return;
  143. }
  144. }
  145. }
  146. private static void AddObjectMetadata (Type type)
  147. {
  148. if (object_metadata.ContainsKey (type))
  149. return;
  150. ObjectMetadata data = new ObjectMetadata ();
  151. if (type.GetInterface("System.Collections.IDictionary") != null)
  152. data.IsDictionary = true;
  153. data.Properties = new Dictionary<string, PropertyMetadata> ();
  154. foreach (PropertyInfo p_info in type.GetProperties())
  155. {
  156. if (p_info.Name == "Item") {
  157. ParameterInfo[] parameters = p_info.GetIndexParameters ();
  158. if (parameters.Length != 1)
  159. continue;
  160. if (parameters[0].ParameterType == typeof (string))
  161. data.ElementType = p_info.PropertyType;
  162. continue;
  163. }
  164. PropertyMetadata p_data = new PropertyMetadata ();
  165. p_data.Info = p_info;
  166. p_data.Type = p_info.PropertyType;
  167. data.Properties.Add (p_info.Name, p_data);
  168. }
  169. foreach (FieldInfo f_info in type.GetFields())
  170. {
  171. PropertyMetadata p_data = new PropertyMetadata ();
  172. p_data.Info = f_info;
  173. p_data.IsField = true;
  174. p_data.Type = f_info.FieldType;
  175. data.Properties.Add (f_info.Name, p_data);
  176. }
  177. lock (object_metadata_lock) {
  178. try {
  179. object_metadata.Add (type, data);
  180. } catch (ArgumentException) {
  181. return;
  182. }
  183. }
  184. }
  185. private static void AddTypeProperties (Type type)
  186. {
  187. if (type_properties.ContainsKey (type))
  188. return;
  189. IList<PropertyMetadata> props = new List<PropertyMetadata> ();
  190. foreach (PropertyInfo p_info in type.GetProperties())
  191. {
  192. if (p_info.Name == "Item")
  193. continue;
  194. PropertyMetadata p_data = new PropertyMetadata ();
  195. p_data.Info = p_info;
  196. p_data.IsField = false;
  197. props.Add (p_data);
  198. }
  199. foreach (FieldInfo f_info in type.GetFields())
  200. {
  201. PropertyMetadata p_data = new PropertyMetadata ();
  202. p_data.Info = f_info;
  203. p_data.IsField = true;
  204. props.Add (p_data);
  205. }
  206. lock (type_properties_lock) {
  207. try {
  208. type_properties.Add (type, props);
  209. } catch (ArgumentException) {
  210. return;
  211. }
  212. }
  213. }
  214. private static MethodInfo GetConvOp (Type t1, Type t2)
  215. {
  216. lock (conv_ops_lock) {
  217. if (! conv_ops.ContainsKey (t1))
  218. conv_ops.Add (t1, new Dictionary<Type, MethodInfo> ());
  219. }
  220. if (conv_ops[t1].ContainsKey (t2))
  221. return conv_ops[t1][t2];
  222. MethodInfo op = t1.GetMethod(
  223. "op_Implicit", new Type[] { t2 });
  224. lock (conv_ops_lock) {
  225. try {
  226. conv_ops[t1].Add (t2, op);
  227. } catch (ArgumentException) {
  228. return conv_ops[t1][t2];
  229. }
  230. }
  231. return op;
  232. }
  233. private static object ReadValue (Type inst_type, JsonReader reader)
  234. {
  235. reader.Read ();
  236. if (reader.Token == JsonToken.ArrayEnd)
  237. return null;
  238. if (reader.Token == JsonToken.Null) {
  239. if (!inst_type.IsClass)
  240. throw new JsonException (String.Format (
  241. "Can't assign null to an instance of type {0}",
  242. inst_type));
  243. return null;
  244. }
  245. if (reader.Token == JsonToken.Double ||
  246. reader.Token == JsonToken.Int ||
  247. reader.Token == JsonToken.Long ||
  248. reader.Token == JsonToken.String ||
  249. reader.Token == JsonToken.Boolean) {
  250. Type json_type = reader.Value.GetType ();
  251. if (inst_type.IsAssignableFrom(json_type))
  252. return reader.Value;
  253. // If there's a custom importer that fits, use it
  254. if (custom_importers_table.ContainsKey (json_type) &&
  255. custom_importers_table[json_type].ContainsKey (
  256. inst_type)) {
  257. ImporterFunc importer =
  258. custom_importers_table[json_type][inst_type];
  259. return importer (reader.Value);
  260. }
  261. // Maybe there's a base importer that works
  262. if (base_importers_table.ContainsKey (json_type) &&
  263. base_importers_table[json_type].ContainsKey (
  264. inst_type)) {
  265. ImporterFunc importer =
  266. base_importers_table[json_type][inst_type];
  267. return importer (reader.Value);
  268. }
  269. // Maybe it's an enum
  270. if (inst_type.IsEnum)
  271. return Enum.ToObject (inst_type, reader.Value);
  272. // Try using an implicit conversion operator
  273. MethodInfo conv_op = GetConvOp (inst_type, json_type);
  274. if (conv_op != null)
  275. return conv_op.Invoke (null,
  276. new object[] { reader.Value });
  277. // No luck
  278. throw new JsonException (String.Format (
  279. "Can't assign value '{0}' (type {1}) to type {2}",
  280. reader.Value, json_type, inst_type));
  281. }
  282. object instance = null;
  283. if (reader.Token == JsonToken.ArrayStart) {
  284. AddArrayMetadata (inst_type);
  285. ArrayMetadata t_data = array_metadata[inst_type];
  286. if (! t_data.IsArray && ! t_data.IsList)
  287. throw new JsonException (String.Format (
  288. "Type {0} can't act as an array",
  289. inst_type));
  290. IList list;
  291. Type elem_type;
  292. if (! t_data.IsArray) {
  293. list = (IList) Activator.CreateInstance (inst_type);
  294. elem_type = t_data.ElementType;
  295. } else {
  296. list = new List<object> ();
  297. elem_type = inst_type.GetElementType ();
  298. }
  299. while (true) {
  300. object item = ReadValue (elem_type, reader);
  301. if (reader.Token == JsonToken.ArrayEnd)
  302. break;
  303. list.Add (item);
  304. }
  305. if (t_data.IsArray) {
  306. int n = list.Count;
  307. instance = Array.CreateInstance (elem_type, n);
  308. for (int i = 0; i < n; i++)
  309. ((Array) instance).SetValue (list[i], i);
  310. } else
  311. instance = list;
  312. } else if (reader.Token == JsonToken.ObjectStart) {
  313. AddObjectMetadata (inst_type);
  314. ObjectMetadata t_data = object_metadata[inst_type];
  315. instance = Activator.CreateInstance (inst_type);
  316. while (true) {
  317. reader.Read ();
  318. if (reader.Token == JsonToken.ObjectEnd)
  319. break;
  320. string property = (string) reader.Value;
  321. if (t_data.Properties.ContainsKey (property)) {
  322. PropertyMetadata prop_data =
  323. t_data.Properties[property];
  324. if (prop_data.IsField) {
  325. ((FieldInfo) prop_data.Info).SetValue (
  326. instance, ReadValue (prop_data.Type, reader));
  327. } else {
  328. PropertyInfo p_info =
  329. (PropertyInfo) prop_data.Info;
  330. if (p_info.CanWrite)
  331. p_info.SetValue (
  332. instance,
  333. ReadValue (prop_data.Type, reader),
  334. null);
  335. else
  336. ReadValue (prop_data.Type, reader);
  337. }
  338. } else {
  339. if (! t_data.IsDictionary)
  340. throw new JsonException (String.Format (
  341. "The type {0} doesn't have the " +
  342. "property '{1}'", inst_type, property));
  343. ((IDictionary) instance).Add (
  344. property, ReadValue (
  345. t_data.ElementType, reader));
  346. }
  347. }
  348. }
  349. return instance;
  350. }
  351. private static IJsonWrapper ReadValue (WrapperFactory factory,
  352. JsonReader reader)
  353. {
  354. reader.Read ();
  355. if (reader.Token == JsonToken.ArrayEnd ||
  356. reader.Token == JsonToken.Null)
  357. return null;
  358. IJsonWrapper instance = factory ();
  359. if (reader.Token == JsonToken.String) {
  360. instance.SetString ((string) reader.Value);
  361. return instance;
  362. }
  363. if (reader.Token == JsonToken.Double) {
  364. instance.SetDouble ((double) reader.Value);
  365. return instance;
  366. }
  367. if (reader.Token == JsonToken.Int) {
  368. instance.SetInt ((int) reader.Value);
  369. return instance;
  370. }
  371. if (reader.Token == JsonToken.Long) {
  372. instance.SetLong ((long) reader.Value);
  373. return instance;
  374. }
  375. if (reader.Token == JsonToken.Boolean) {
  376. instance.SetBoolean ((bool) reader.Value);
  377. return instance;
  378. }
  379. if (reader.Token == JsonToken.ArrayStart) {
  380. instance.SetJsonType (JsonType.Array);
  381. while (true) {
  382. IJsonWrapper item = ReadValue (factory, reader);
  383. // nij - added check to see if the item is not null. This is to handle arrays within arrays.
  384. // In those cases when the outer array read the inner array an item was returned back the current
  385. // reader.Token is at the ArrayEnd for the inner array.
  386. if (item == null && reader.Token == JsonToken.ArrayEnd)
  387. break;
  388. ((IList) instance).Add (item);
  389. }
  390. }
  391. else if (reader.Token == JsonToken.ObjectStart) {
  392. instance.SetJsonType (JsonType.Object);
  393. while (true) {
  394. reader.Read ();
  395. if (reader.Token == JsonToken.ObjectEnd)
  396. break;
  397. string property = (string) reader.Value;
  398. ((IDictionary) instance)[property] = ReadValue (
  399. factory, reader);
  400. }
  401. }
  402. return instance;
  403. }
  404. private static void RegisterBaseExporters ()
  405. {
  406. base_exporters_table[typeof (byte)] =
  407. delegate (object obj, JsonWriter writer) {
  408. writer.Write (Convert.ToInt32 ((byte) obj));
  409. };
  410. base_exporters_table[typeof (char)] =
  411. delegate (object obj, JsonWriter writer) {
  412. writer.Write (Convert.ToString ((char) obj));
  413. };
  414. base_exporters_table[typeof (DateTime)] =
  415. delegate (object obj, JsonWriter writer) {
  416. writer.Write (Convert.ToString ((DateTime) obj,
  417. datetime_format));
  418. };
  419. base_exporters_table[typeof (decimal)] =
  420. delegate (object obj, JsonWriter writer) {
  421. writer.Write ((decimal) obj);
  422. };
  423. base_exporters_table[typeof (sbyte)] =
  424. delegate (object obj, JsonWriter writer) {
  425. writer.Write (Convert.ToInt32 ((sbyte) obj));
  426. };
  427. base_exporters_table[typeof (short)] =
  428. delegate (object obj, JsonWriter writer) {
  429. writer.Write (Convert.ToInt32 ((short) obj));
  430. };
  431. base_exporters_table[typeof (ushort)] =
  432. delegate (object obj, JsonWriter writer) {
  433. writer.Write (Convert.ToInt32 ((ushort) obj));
  434. };
  435. base_exporters_table[typeof (uint)] =
  436. delegate (object obj, JsonWriter writer) {
  437. writer.Write (Convert.ToUInt64 ((uint) obj));
  438. };
  439. base_exporters_table[typeof (ulong)] =
  440. delegate (object obj, JsonWriter writer) {
  441. writer.Write ((ulong) obj);
  442. };
  443. }
  444. private static void RegisterBaseImporters ()
  445. {
  446. ImporterFunc importer;
  447. importer = delegate (object input) {
  448. return Convert.ToByte ((int) input);
  449. };
  450. RegisterImporter (base_importers_table, typeof (int),
  451. typeof (byte), importer);
  452. importer = delegate (object input) {
  453. return Convert.ToUInt64 ((int) input);
  454. };
  455. RegisterImporter (base_importers_table, typeof (int),
  456. typeof (ulong), importer);
  457. importer = delegate (object input) {
  458. return Convert.ToSByte ((int) input);
  459. };
  460. RegisterImporter (base_importers_table, typeof (int),
  461. typeof (sbyte), importer);
  462. importer = delegate (object input) {
  463. return Convert.ToInt16 ((int) input);
  464. };
  465. RegisterImporter (base_importers_table, typeof (int),
  466. typeof (short), importer);
  467. importer = delegate (object input) {
  468. return Convert.ToUInt16 ((int) input);
  469. };
  470. RegisterImporter (base_importers_table, typeof (int),
  471. typeof (ushort), importer);
  472. importer = delegate (object input) {
  473. return Convert.ToUInt32 ((int) input);
  474. };
  475. RegisterImporter (base_importers_table, typeof (int),
  476. typeof (uint), importer);
  477. importer = delegate (object input) {
  478. return Convert.ToSingle ((int) input);
  479. };
  480. RegisterImporter (base_importers_table, typeof (int),
  481. typeof (float), importer);
  482. importer = delegate (object input) {
  483. return Convert.ToDouble ((int) input);
  484. };
  485. RegisterImporter (base_importers_table, typeof (int),
  486. typeof (double), importer);
  487. importer = delegate (object input) {
  488. return Convert.ToDecimal ((double) input);
  489. };
  490. RegisterImporter (base_importers_table, typeof (double),
  491. typeof (decimal), importer);
  492. importer = delegate (object input) {
  493. return Convert.ToUInt32 ((long) input);
  494. };
  495. RegisterImporter (base_importers_table, typeof (long),
  496. typeof (uint), importer);
  497. importer = delegate (object input) {
  498. return Convert.ToChar ((string) input);
  499. };
  500. RegisterImporter (base_importers_table, typeof (string),
  501. typeof (char), importer);
  502. importer = delegate (object input) {
  503. return Convert.ToDateTime ((string) input, datetime_format);
  504. };
  505. RegisterImporter (base_importers_table, typeof (string),
  506. typeof (DateTime), importer);
  507. }
  508. private static void RegisterImporter (
  509. IDictionary<Type, IDictionary<Type, ImporterFunc>> table,
  510. Type json_type, Type value_type, ImporterFunc importer)
  511. {
  512. if (! table.ContainsKey (json_type))
  513. table.Add (json_type, new Dictionary<Type, ImporterFunc> ());
  514. table[json_type][value_type] = importer;
  515. }
  516. private static void WriteValue (object obj, JsonWriter writer,
  517. bool writer_is_private,
  518. int depth)
  519. {
  520. if (depth > max_nesting_depth)
  521. throw new JsonException (
  522. String.Format ("Max allowed object depth reached while " +
  523. "trying to export from type {0}",
  524. obj.GetType ()));
  525. if (obj == null) {
  526. writer.Write (null);
  527. return;
  528. }
  529. if (obj is IJsonWrapper) {
  530. if (writer_is_private)
  531. writer.TextWriter.Write (((IJsonWrapper) obj).ToJson ());
  532. else
  533. ((IJsonWrapper) obj).ToJson (writer);
  534. return;
  535. }
  536. if (obj is String) {
  537. writer.Write ((string) obj);
  538. return;
  539. }
  540. if (obj is Double) {
  541. writer.Write ((double) obj);
  542. return;
  543. }
  544. if (obj is Int32) {
  545. writer.Write ((int) obj);
  546. return;
  547. }
  548. if (obj is Boolean) {
  549. writer.Write ((bool) obj);
  550. return;
  551. }
  552. if (obj is Int64) {
  553. writer.Write ((long) obj);
  554. return;
  555. }
  556. if (obj is Array) {
  557. writer.WriteArrayStart ();
  558. foreach (object elem in (Array) obj)
  559. WriteValue (elem, writer, writer_is_private, depth + 1);
  560. writer.WriteArrayEnd ();
  561. return;
  562. }
  563. if (obj is IList) {
  564. writer.WriteArrayStart ();
  565. foreach (object elem in (IList) obj)
  566. WriteValue (elem, writer, writer_is_private, depth + 1);
  567. writer.WriteArrayEnd ();
  568. return;
  569. }
  570. if (obj is IDictionary) {
  571. writer.WriteObjectStart ();
  572. foreach (DictionaryEntry entry in (IDictionary) obj) {
  573. writer.WritePropertyName ((string) entry.Key);
  574. WriteValue (entry.Value, writer, writer_is_private,
  575. depth + 1);
  576. }
  577. writer.WriteObjectEnd ();
  578. return;
  579. }
  580. Type obj_type = obj.GetType ();
  581. // See if there's a custom exporter for the object
  582. if (custom_exporters_table.ContainsKey (obj_type)) {
  583. ExporterFunc exporter = custom_exporters_table[obj_type];
  584. exporter (obj, writer);
  585. return;
  586. }
  587. // If not, maybe there's a base exporter
  588. if (base_exporters_table.ContainsKey (obj_type)) {
  589. ExporterFunc exporter = base_exporters_table[obj_type];
  590. exporter (obj, writer);
  591. return;
  592. }
  593. // Last option, let's see if it's an enum
  594. if (obj is Enum) {
  595. Type e_type = Enum.GetUnderlyingType (obj_type);
  596. if (e_type == typeof (long)
  597. || e_type == typeof (uint)
  598. || e_type == typeof (ulong))
  599. writer.Write ((ulong) obj);
  600. else
  601. writer.Write ((int) obj);
  602. return;
  603. }
  604. // Okay, so it looks like the input should be exported as an
  605. // object
  606. AddTypeProperties (obj_type);
  607. IList<PropertyMetadata> props = type_properties[obj_type];
  608. writer.WriteObjectStart ();
  609. foreach (PropertyMetadata p_data in props) {
  610. if (p_data.IsField) {
  611. writer.WritePropertyName (p_data.Info.Name);
  612. WriteValue (((FieldInfo) p_data.Info).GetValue (obj),
  613. writer, writer_is_private, depth + 1);
  614. }
  615. else {
  616. PropertyInfo p_info = (PropertyInfo) p_data.Info;
  617. if (p_info.CanRead) {
  618. writer.WritePropertyName (p_data.Info.Name);
  619. WriteValue (p_info.GetValue (obj, null),
  620. writer, writer_is_private, depth + 1);
  621. }
  622. }
  623. }
  624. writer.WriteObjectEnd ();
  625. }
  626. #endregion
  627. public static string ToJson (object obj)
  628. {
  629. lock (static_writer_lock) {
  630. static_writer.Reset ();
  631. WriteValue (obj, static_writer, true, 0);
  632. return static_writer.ToString ();
  633. }
  634. }
  635. public static void ToJson (object obj, JsonWriter writer)
  636. {
  637. WriteValue (obj, writer, false, 0);
  638. }
  639. public static JsonData ToObject (JsonReader reader)
  640. {
  641. return (JsonData) ToWrapper (
  642. delegate { return new JsonData (); }, reader);
  643. }
  644. public static JsonData ToObject (TextReader reader)
  645. {
  646. JsonReader json_reader = new JsonReader (reader);
  647. return (JsonData) ToWrapper (
  648. delegate { return new JsonData (); }, json_reader);
  649. }
  650. public static JsonData ToObject (string json)
  651. {
  652. return (JsonData) ToWrapper (
  653. delegate { return new JsonData (); }, json);
  654. }
  655. public static T ToObject<T> (JsonReader reader)
  656. {
  657. return (T) ReadValue (typeof (T), reader);
  658. }
  659. public static T ToObject<T> (TextReader reader)
  660. {
  661. JsonReader json_reader = new JsonReader (reader);
  662. return (T) ReadValue (typeof (T), json_reader);
  663. }
  664. public static T ToObject<T> (string json)
  665. {
  666. JsonReader reader = new JsonReader (json);
  667. return (T) ReadValue (typeof (T), reader);
  668. }
  669. public static IJsonWrapper ToWrapper (WrapperFactory factory,
  670. JsonReader reader)
  671. {
  672. return ReadValue (factory, reader);
  673. }
  674. public static IJsonWrapper ToWrapper (WrapperFactory factory,
  675. string json)
  676. {
  677. JsonReader reader = new JsonReader (json);
  678. return ReadValue (factory, reader);
  679. }
  680. public static void RegisterExporter<T> (ExporterFunc<T> exporter)
  681. {
  682. ExporterFunc exporter_wrapper =
  683. delegate (object obj, JsonWriter writer) {
  684. exporter ((T) obj, writer);
  685. };
  686. custom_exporters_table[typeof (T)] = exporter_wrapper;
  687. }
  688. public static void RegisterImporter<TJson, TValue> (
  689. ImporterFunc<TJson, TValue> importer)
  690. {
  691. ImporterFunc importer_wrapper =
  692. delegate (object input) {
  693. return importer ((TJson) input);
  694. };
  695. RegisterImporter (custom_importers_table, typeof (TJson),
  696. typeof (TValue), importer_wrapper);
  697. }
  698. public static void UnregisterExporters ()
  699. {
  700. custom_exporters_table.Clear ();
  701. }
  702. public static void UnregisterImporters ()
  703. {
  704. custom_importers_table.Clear ();
  705. }
  706. }
  707. }