JsonMapper.cs 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.Globalization;
  5. using System.IO;
  6. using System.Reflection;
  7. using System.Runtime.CompilerServices;
  8. using UnityEngine;
  9. namespace LitJson
  10. {
  11. public class JsonMapper
  12. {
  13. static JsonMapper()
  14. {
  15. JsonMapper.max_nesting_depth = 100;
  16. JsonMapper.array_metadata = new Dictionary<Type, ArrayMetadata>();
  17. JsonMapper.conv_ops = new Dictionary<Type, IDictionary<Type, MethodInfo>>();
  18. JsonMapper.object_metadata = new Dictionary<Type, ObjectMetadata>();
  19. JsonMapper.type_properties = new Dictionary<Type, IList<PropertyMetadata>>();
  20. JsonMapper.static_writer = new JsonWriter();
  21. JsonMapper.datetime_format = DateTimeFormatInfo.InvariantInfo;
  22. JsonMapper.base_exporters_table = new Dictionary<Type, ExporterFunc>();
  23. JsonMapper.custom_exporters_table = new Dictionary<Type, ExporterFunc>();
  24. JsonMapper.base_importers_table = new Dictionary<Type, IDictionary<Type, ImporterFunc>>();
  25. JsonMapper.custom_importers_table = new Dictionary<Type, IDictionary<Type, ImporterFunc>>();
  26. JsonMapper.RegisterBaseExporters();
  27. JsonMapper.RegisterBaseImporters();
  28. }
  29. private static void AddArrayMetadata(Type type)
  30. {
  31. if (JsonMapper.array_metadata.ContainsKey(type))
  32. {
  33. return;
  34. }
  35. ArrayMetadata value = default(ArrayMetadata);
  36. value.IsArray = type.IsArray;
  37. if (type.GetInterface("System.Collections.IList") != null)
  38. {
  39. value.IsList = true;
  40. }
  41. foreach (PropertyInfo propertyInfo in type.GetProperties())
  42. {
  43. if (!(propertyInfo.Name != "Item"))
  44. {
  45. ParameterInfo[] indexParameters = propertyInfo.GetIndexParameters();
  46. if (indexParameters.Length == 1)
  47. {
  48. if (indexParameters[0].ParameterType == typeof(int))
  49. {
  50. value.ElementType = propertyInfo.PropertyType;
  51. }
  52. }
  53. }
  54. }
  55. object obj = JsonMapper.array_metadata_lock;
  56. lock (obj)
  57. {
  58. try
  59. {
  60. JsonMapper.array_metadata.Add(type, value);
  61. }
  62. catch (ArgumentException)
  63. {
  64. }
  65. }
  66. }
  67. private static void AddObjectMetadata(Type type)
  68. {
  69. if (JsonMapper.object_metadata.ContainsKey(type))
  70. {
  71. return;
  72. }
  73. ObjectMetadata value = default(ObjectMetadata);
  74. if (type.GetInterface("System.Collections.IDictionary") != null)
  75. {
  76. value.IsDictionary = true;
  77. }
  78. value.Properties = new Dictionary<string, PropertyMetadata>();
  79. foreach (PropertyInfo propertyInfo in type.GetProperties())
  80. {
  81. if (propertyInfo.Name == "Item")
  82. {
  83. ParameterInfo[] indexParameters = propertyInfo.GetIndexParameters();
  84. if (indexParameters.Length == 1)
  85. {
  86. if (indexParameters[0].ParameterType == typeof(string))
  87. {
  88. value.ElementType = propertyInfo.PropertyType;
  89. }
  90. }
  91. }
  92. else
  93. {
  94. PropertyMetadata value2 = default(PropertyMetadata);
  95. value2.Info = propertyInfo;
  96. value2.Type = propertyInfo.PropertyType;
  97. value.Properties.Add(propertyInfo.Name, value2);
  98. }
  99. }
  100. foreach (FieldInfo fieldInfo in type.GetFields())
  101. {
  102. PropertyMetadata value3 = default(PropertyMetadata);
  103. value3.Info = fieldInfo;
  104. value3.IsField = true;
  105. value3.Type = fieldInfo.FieldType;
  106. value.Properties.Add(fieldInfo.Name, value3);
  107. }
  108. object obj = JsonMapper.object_metadata_lock;
  109. lock (obj)
  110. {
  111. try
  112. {
  113. JsonMapper.object_metadata.Add(type, value);
  114. }
  115. catch (ArgumentException)
  116. {
  117. }
  118. }
  119. }
  120. private static void AddTypeProperties(Type type)
  121. {
  122. if (JsonMapper.type_properties.ContainsKey(type))
  123. {
  124. return;
  125. }
  126. IList<PropertyMetadata> list = new List<PropertyMetadata>();
  127. foreach (PropertyInfo propertyInfo in type.GetProperties())
  128. {
  129. if (!(propertyInfo.Name == "Item"))
  130. {
  131. list.Add(new PropertyMetadata
  132. {
  133. Info = propertyInfo,
  134. IsField = false
  135. });
  136. }
  137. }
  138. foreach (FieldInfo info in type.GetFields())
  139. {
  140. list.Add(new PropertyMetadata
  141. {
  142. Info = info,
  143. IsField = true
  144. });
  145. }
  146. object obj = JsonMapper.type_properties_lock;
  147. lock (obj)
  148. {
  149. try
  150. {
  151. JsonMapper.type_properties.Add(type, list);
  152. }
  153. catch (ArgumentException)
  154. {
  155. }
  156. }
  157. }
  158. private static MethodInfo GetConvOp(Type t1, Type t2)
  159. {
  160. object obj = JsonMapper.conv_ops_lock;
  161. lock (obj)
  162. {
  163. if (!JsonMapper.conv_ops.ContainsKey(t1))
  164. {
  165. JsonMapper.conv_ops.Add(t1, new Dictionary<Type, MethodInfo>());
  166. }
  167. }
  168. if (JsonMapper.conv_ops[t1].ContainsKey(t2))
  169. {
  170. return JsonMapper.conv_ops[t1][t2];
  171. }
  172. MethodInfo method = t1.GetMethod("op_Implicit", new Type[]
  173. {
  174. t2
  175. });
  176. object obj2 = JsonMapper.conv_ops_lock;
  177. lock (obj2)
  178. {
  179. try
  180. {
  181. JsonMapper.conv_ops[t1].Add(t2, method);
  182. }
  183. catch (ArgumentException)
  184. {
  185. return JsonMapper.conv_ops[t1][t2];
  186. }
  187. }
  188. return method;
  189. }
  190. private static object ReadValue(Type inst_type, JsonReader reader)
  191. {
  192. reader.Read();
  193. if (reader.Token == JsonToken.ArrayEnd)
  194. {
  195. return null;
  196. }
  197. Type underlyingType = Nullable.GetUnderlyingType(inst_type);
  198. Type type = underlyingType ?? inst_type;
  199. if (reader.Token == JsonToken.Null)
  200. {
  201. if (inst_type.IsClass || underlyingType != null)
  202. {
  203. return null;
  204. }
  205. throw new JsonException(string.Format("Can't assign null to an instance of type {0}", inst_type));
  206. }
  207. else
  208. {
  209. if (reader.Token != JsonToken.Double && reader.Token != JsonToken.Int && reader.Token != JsonToken.Long && reader.Token != JsonToken.String && reader.Token != JsonToken.Boolean)
  210. {
  211. object obj = null;
  212. if (reader.Token == JsonToken.ArrayStart)
  213. {
  214. JsonMapper.AddArrayMetadata(inst_type);
  215. ArrayMetadata arrayMetadata = JsonMapper.array_metadata[inst_type];
  216. if (!arrayMetadata.IsArray && !arrayMetadata.IsList)
  217. {
  218. throw new JsonException(string.Format("Type {0} can't act as an array", inst_type));
  219. }
  220. IList list;
  221. Type elementType;
  222. if (!arrayMetadata.IsArray)
  223. {
  224. list = (IList)Activator.CreateInstance(inst_type);
  225. elementType = arrayMetadata.ElementType;
  226. }
  227. else
  228. {
  229. list = new ArrayList();
  230. elementType = inst_type.GetElementType();
  231. }
  232. for (;;)
  233. {
  234. object obj2 = JsonMapper.ReadValue(elementType, reader);
  235. if (obj2 == null && reader.Token == JsonToken.ArrayEnd)
  236. {
  237. break;
  238. }
  239. list.Add(obj2);
  240. }
  241. if (arrayMetadata.IsArray)
  242. {
  243. int count = list.Count;
  244. obj = Array.CreateInstance(elementType, count);
  245. for (int i = 0; i < count; i++)
  246. {
  247. ((Array)obj).SetValue(list[i], i);
  248. }
  249. }
  250. else
  251. {
  252. obj = list;
  253. }
  254. }
  255. else if (reader.Token == JsonToken.ObjectStart)
  256. {
  257. JsonMapper.AddObjectMetadata(type);
  258. ObjectMetadata objectMetadata = JsonMapper.object_metadata[type];
  259. obj = Activator.CreateInstance(type);
  260. string text;
  261. for (;;)
  262. {
  263. reader.Read();
  264. if (reader.Token == JsonToken.ObjectEnd)
  265. {
  266. break;
  267. }
  268. text = (string)reader.Value;
  269. if (objectMetadata.Properties.ContainsKey(text))
  270. {
  271. PropertyMetadata propertyMetadata = objectMetadata.Properties[text];
  272. if (propertyMetadata.IsField)
  273. {
  274. ((FieldInfo)propertyMetadata.Info).SetValue(obj, JsonMapper.ReadValue(propertyMetadata.Type, reader));
  275. }
  276. else
  277. {
  278. PropertyInfo propertyInfo = (PropertyInfo)propertyMetadata.Info;
  279. if (propertyInfo.CanWrite)
  280. {
  281. propertyInfo.SetValue(obj, JsonMapper.ReadValue(propertyMetadata.Type, reader), null);
  282. }
  283. else
  284. {
  285. JsonMapper.ReadValue(propertyMetadata.Type, reader);
  286. }
  287. }
  288. }
  289. else if (!objectMetadata.IsDictionary)
  290. {
  291. if (!reader.SkipNonMembers)
  292. {
  293. goto Block_32;
  294. }
  295. JsonMapper.ReadSkip(reader);
  296. }
  297. else
  298. {
  299. ((IDictionary)obj).Add(text, JsonMapper.ReadValue(objectMetadata.ElementType, reader));
  300. }
  301. }
  302. return obj;
  303. Block_32:
  304. throw new JsonException(string.Format("The type {0} doesn't have the property '{1}'", inst_type, text));
  305. }
  306. return obj;
  307. }
  308. Type type2 = reader.Value.GetType();
  309. if (type.IsAssignableFrom(type2))
  310. {
  311. return reader.Value;
  312. }
  313. if (inst_type == typeof(float) && type2 == typeof(double))
  314. {
  315. return (float)((double)reader.Value);
  316. }
  317. if (JsonMapper.custom_importers_table.ContainsKey(type2) && JsonMapper.custom_importers_table[type2].ContainsKey(type))
  318. {
  319. ImporterFunc importerFunc = JsonMapper.custom_importers_table[type2][type];
  320. return importerFunc(reader.Value);
  321. }
  322. if (JsonMapper.base_importers_table.ContainsKey(type2) && JsonMapper.base_importers_table[type2].ContainsKey(type))
  323. {
  324. ImporterFunc importerFunc2 = JsonMapper.base_importers_table[type2][type];
  325. return importerFunc2(reader.Value);
  326. }
  327. if (type.IsEnum)
  328. {
  329. return Enum.ToObject(type, reader.Value);
  330. }
  331. MethodInfo convOp = JsonMapper.GetConvOp(type, type2);
  332. if (convOp != null)
  333. {
  334. return convOp.Invoke(null, new object[]
  335. {
  336. reader.Value
  337. });
  338. }
  339. throw new JsonException(string.Format("Can't assign value '{0}' (type {1}) to type {2}", reader.Value, type2, inst_type));
  340. }
  341. }
  342. private static IJsonWrapper ReadValue(WrapperFactory factory, JsonReader reader)
  343. {
  344. reader.Read();
  345. if (reader.Token == JsonToken.ArrayEnd || reader.Token == JsonToken.Null)
  346. {
  347. return null;
  348. }
  349. IJsonWrapper jsonWrapper = factory();
  350. if (reader.Token == JsonToken.String)
  351. {
  352. jsonWrapper.SetString((string)reader.Value);
  353. return jsonWrapper;
  354. }
  355. if (reader.Token == JsonToken.Double)
  356. {
  357. jsonWrapper.SetDouble((double)reader.Value);
  358. return jsonWrapper;
  359. }
  360. if (reader.Token == JsonToken.Int)
  361. {
  362. jsonWrapper.SetInt((int)reader.Value);
  363. return jsonWrapper;
  364. }
  365. if (reader.Token == JsonToken.Long)
  366. {
  367. jsonWrapper.SetLong((long)reader.Value);
  368. return jsonWrapper;
  369. }
  370. if (reader.Token == JsonToken.Boolean)
  371. {
  372. jsonWrapper.SetBoolean((bool)reader.Value);
  373. return jsonWrapper;
  374. }
  375. if (reader.Token == JsonToken.ArrayStart)
  376. {
  377. jsonWrapper.SetJsonType(JsonType.Array);
  378. for (;;)
  379. {
  380. IJsonWrapper jsonWrapper2 = JsonMapper.ReadValue(factory, reader);
  381. if (jsonWrapper2 == null && reader.Token == JsonToken.ArrayEnd)
  382. {
  383. break;
  384. }
  385. jsonWrapper.Add(jsonWrapper2);
  386. }
  387. }
  388. else if (reader.Token == JsonToken.ObjectStart)
  389. {
  390. jsonWrapper.SetJsonType(JsonType.Object);
  391. for (;;)
  392. {
  393. reader.Read();
  394. if (reader.Token == JsonToken.ObjectEnd)
  395. {
  396. break;
  397. }
  398. string key = (string)reader.Value;
  399. jsonWrapper[key] = JsonMapper.ReadValue(factory, reader);
  400. }
  401. }
  402. return jsonWrapper;
  403. }
  404. private static void ReadSkip(JsonReader reader)
  405. {
  406. JsonMapper.ToWrapper(() => new JsonMockWrapper(), reader);
  407. }
  408. private static void RegisterBaseExporters()
  409. {
  410. JsonMapper.base_exporters_table[typeof(byte)] = delegate(object obj, JsonWriter writer)
  411. {
  412. writer.Write(Convert.ToInt32((byte)obj));
  413. };
  414. JsonMapper.base_exporters_table[typeof(char)] = delegate(object obj, JsonWriter writer)
  415. {
  416. writer.Write(Convert.ToString((char)obj));
  417. };
  418. JsonMapper.base_exporters_table[typeof(DateTime)] = delegate(object obj, JsonWriter writer)
  419. {
  420. writer.Write(Convert.ToString((DateTime)obj, JsonMapper.datetime_format));
  421. };
  422. JsonMapper.base_exporters_table[typeof(decimal)] = delegate(object obj, JsonWriter writer)
  423. {
  424. writer.Write((decimal)obj);
  425. };
  426. JsonMapper.base_exporters_table[typeof(sbyte)] = delegate(object obj, JsonWriter writer)
  427. {
  428. writer.Write(Convert.ToInt32((sbyte)obj));
  429. };
  430. JsonMapper.base_exporters_table[typeof(short)] = delegate(object obj, JsonWriter writer)
  431. {
  432. writer.Write(Convert.ToInt32((short)obj));
  433. };
  434. JsonMapper.base_exporters_table[typeof(ushort)] = delegate(object obj, JsonWriter writer)
  435. {
  436. writer.Write(Convert.ToInt32((ushort)obj));
  437. };
  438. JsonMapper.base_exporters_table[typeof(uint)] = delegate(object obj, JsonWriter writer)
  439. {
  440. writer.Write(Convert.ToUInt64((uint)obj));
  441. };
  442. JsonMapper.base_exporters_table[typeof(ulong)] = delegate(object obj, JsonWriter writer)
  443. {
  444. writer.Write((ulong)obj);
  445. };
  446. IDictionary<Type, ExporterFunc> dictionary = JsonMapper.base_exporters_table;
  447. Type typeFromHandle = typeof(Vector2);
  448. if (JsonMapper._003C_003Ef__mg_0024cache0 == null)
  449. {
  450. JsonMapper._003C_003Ef__mg_0024cache0 = new ExporterFunc(JsonMapper.ExportVector2);
  451. }
  452. dictionary[typeFromHandle] = JsonMapper._003C_003Ef__mg_0024cache0;
  453. IDictionary<Type, ExporterFunc> dictionary2 = JsonMapper.base_exporters_table;
  454. Type typeFromHandle2 = typeof(Vector3);
  455. if (JsonMapper._003C_003Ef__mg_0024cache1 == null)
  456. {
  457. JsonMapper._003C_003Ef__mg_0024cache1 = new ExporterFunc(JsonMapper.ExportVector3);
  458. }
  459. dictionary2[typeFromHandle2] = JsonMapper._003C_003Ef__mg_0024cache1;
  460. IDictionary<Type, ExporterFunc> dictionary3 = JsonMapper.base_exporters_table;
  461. Type typeFromHandle3 = typeof(Vector4);
  462. if (JsonMapper._003C_003Ef__mg_0024cache2 == null)
  463. {
  464. JsonMapper._003C_003Ef__mg_0024cache2 = new ExporterFunc(JsonMapper.ExportVector4);
  465. }
  466. dictionary3[typeFromHandle3] = JsonMapper._003C_003Ef__mg_0024cache2;
  467. IDictionary<Type, ExporterFunc> dictionary4 = JsonMapper.base_exporters_table;
  468. Type typeFromHandle4 = typeof(Bounds);
  469. if (JsonMapper._003C_003Ef__mg_0024cache3 == null)
  470. {
  471. JsonMapper._003C_003Ef__mg_0024cache3 = new ExporterFunc(JsonMapper.ExportBounds);
  472. }
  473. dictionary4[typeFromHandle4] = JsonMapper._003C_003Ef__mg_0024cache3;
  474. IDictionary<Type, ExporterFunc> dictionary5 = JsonMapper.base_exporters_table;
  475. Type typeFromHandle5 = typeof(Color);
  476. if (JsonMapper._003C_003Ef__mg_0024cache4 == null)
  477. {
  478. JsonMapper._003C_003Ef__mg_0024cache4 = new ExporterFunc(JsonMapper.ExportColor);
  479. }
  480. dictionary5[typeFromHandle5] = JsonMapper._003C_003Ef__mg_0024cache4;
  481. IDictionary<Type, ExporterFunc> dictionary6 = JsonMapper.base_exporters_table;
  482. Type typeFromHandle6 = typeof(Color32);
  483. if (JsonMapper._003C_003Ef__mg_0024cache5 == null)
  484. {
  485. JsonMapper._003C_003Ef__mg_0024cache5 = new ExporterFunc(JsonMapper.ExportColor32);
  486. }
  487. dictionary6[typeFromHandle6] = JsonMapper._003C_003Ef__mg_0024cache5;
  488. IDictionary<Type, ExporterFunc> dictionary7 = JsonMapper.base_exporters_table;
  489. Type typeFromHandle7 = typeof(Ray);
  490. if (JsonMapper._003C_003Ef__mg_0024cache6 == null)
  491. {
  492. JsonMapper._003C_003Ef__mg_0024cache6 = new ExporterFunc(JsonMapper.ExportRay);
  493. }
  494. dictionary7[typeFromHandle7] = JsonMapper._003C_003Ef__mg_0024cache6;
  495. IDictionary<Type, ExporterFunc> dictionary8 = JsonMapper.base_exporters_table;
  496. Type typeFromHandle8 = typeof(Rect);
  497. if (JsonMapper._003C_003Ef__mg_0024cache7 == null)
  498. {
  499. JsonMapper._003C_003Ef__mg_0024cache7 = new ExporterFunc(JsonMapper.ExportRect);
  500. }
  501. dictionary8[typeFromHandle8] = JsonMapper._003C_003Ef__mg_0024cache7;
  502. IDictionary<Type, ExporterFunc> dictionary9 = JsonMapper.base_exporters_table;
  503. Type typeFromHandle9 = typeof(Quaternion);
  504. if (JsonMapper._003C_003Ef__mg_0024cache8 == null)
  505. {
  506. JsonMapper._003C_003Ef__mg_0024cache8 = new ExporterFunc(JsonMapper.ExportQuaternion);
  507. }
  508. dictionary9[typeFromHandle9] = JsonMapper._003C_003Ef__mg_0024cache8;
  509. }
  510. private static void ExportVector2(object obj, JsonWriter writer)
  511. {
  512. Vector2 vector = (Vector2)obj;
  513. writer.WriteObjectStart();
  514. writer.WritePropertyName("x");
  515. writer.Write((double)vector.x);
  516. writer.WritePropertyName("y");
  517. writer.Write((double)vector.y);
  518. writer.WriteObjectEnd();
  519. }
  520. private static void ExportVector3(object obj, JsonWriter writer)
  521. {
  522. Vector3 vector = (Vector3)obj;
  523. writer.WriteObjectStart();
  524. writer.WritePropertyName("x");
  525. writer.Write((double)vector.x);
  526. writer.WritePropertyName("y");
  527. writer.Write((double)vector.y);
  528. writer.WritePropertyName("z");
  529. writer.Write((double)vector.z);
  530. writer.WriteObjectEnd();
  531. }
  532. private static void ExportVector4(object obj, JsonWriter writer)
  533. {
  534. Vector4 vector = (Vector4)obj;
  535. writer.WriteObjectStart();
  536. writer.WritePropertyName("x");
  537. writer.Write((double)vector.x);
  538. writer.WritePropertyName("y");
  539. writer.Write((double)vector.y);
  540. writer.WritePropertyName("z");
  541. writer.Write((double)vector.z);
  542. writer.WritePropertyName("w");
  543. writer.Write((double)vector.w);
  544. writer.WriteObjectEnd();
  545. }
  546. private static void ExportBounds(object obj, JsonWriter writer)
  547. {
  548. Bounds bounds = (Bounds)obj;
  549. writer.WriteObjectStart();
  550. writer.WritePropertyName("center");
  551. JsonMapper.ExportVector3(bounds.center, writer);
  552. writer.WritePropertyName("size");
  553. JsonMapper.ExportVector3(bounds.size, writer);
  554. writer.WriteObjectEnd();
  555. }
  556. private static void ExportColor(object obj, JsonWriter writer)
  557. {
  558. Color color = (Color)obj;
  559. writer.WriteObjectStart();
  560. writer.WritePropertyName("r");
  561. writer.Write((double)color.r);
  562. writer.WritePropertyName("g");
  563. writer.Write((double)color.g);
  564. writer.WritePropertyName("b");
  565. writer.Write((double)color.b);
  566. writer.WritePropertyName("a");
  567. writer.Write((double)color.a);
  568. writer.WriteObjectEnd();
  569. }
  570. private static void ExportColor32(object obj, JsonWriter writer)
  571. {
  572. Color32 color = (Color32)obj;
  573. writer.WriteObjectStart();
  574. writer.WritePropertyName("r");
  575. writer.Write((int)color.r);
  576. writer.WritePropertyName("g");
  577. writer.Write((int)color.g);
  578. writer.WritePropertyName("b");
  579. writer.Write((int)color.b);
  580. writer.WritePropertyName("a");
  581. writer.Write((int)color.a);
  582. writer.WriteObjectEnd();
  583. }
  584. private static void ExportRay(object obj, JsonWriter writer)
  585. {
  586. Ray ray = (Ray)obj;
  587. writer.WriteObjectStart();
  588. writer.WritePropertyName("origin");
  589. JsonMapper.ExportVector3(ray.origin, writer);
  590. writer.WritePropertyName("direction");
  591. JsonMapper.ExportVector3(ray.direction, writer);
  592. writer.WriteObjectEnd();
  593. }
  594. private static void ExportRect(object obj, JsonWriter writer)
  595. {
  596. Rect rect = (Rect)obj;
  597. writer.WriteObjectStart();
  598. writer.WritePropertyName("xMin");
  599. writer.Write((double)rect.xMin);
  600. writer.WritePropertyName("xMax");
  601. writer.Write((double)rect.xMax);
  602. writer.WritePropertyName("yMin");
  603. writer.Write((double)rect.yMin);
  604. writer.WritePropertyName("yMax");
  605. writer.Write((double)rect.yMax);
  606. writer.WriteObjectEnd();
  607. }
  608. private static void ExportQuaternion(object obj, JsonWriter writer)
  609. {
  610. Quaternion quaternion = (Quaternion)obj;
  611. writer.WriteObjectStart();
  612. writer.WritePropertyName("x");
  613. writer.Write((double)quaternion.x);
  614. writer.WritePropertyName("y");
  615. writer.Write((double)quaternion.y);
  616. writer.WritePropertyName("z");
  617. writer.Write((double)quaternion.z);
  618. writer.WritePropertyName("w");
  619. writer.Write((double)quaternion.w);
  620. writer.WriteObjectEnd();
  621. }
  622. private static void RegisterBaseImporters()
  623. {
  624. ImporterFunc importer = (object input) => Convert.ToByte((int)input);
  625. JsonMapper.RegisterImporter(JsonMapper.base_importers_table, typeof(int), typeof(byte), importer);
  626. importer = ((object input) => Convert.ToUInt64((int)input));
  627. JsonMapper.RegisterImporter(JsonMapper.base_importers_table, typeof(int), typeof(ulong), importer);
  628. importer = ((object input) => Convert.ToSByte((int)input));
  629. JsonMapper.RegisterImporter(JsonMapper.base_importers_table, typeof(int), typeof(sbyte), importer);
  630. importer = ((object input) => Convert.ToInt16((int)input));
  631. JsonMapper.RegisterImporter(JsonMapper.base_importers_table, typeof(int), typeof(short), importer);
  632. importer = ((object input) => Convert.ToUInt16((int)input));
  633. JsonMapper.RegisterImporter(JsonMapper.base_importers_table, typeof(int), typeof(ushort), importer);
  634. importer = ((object input) => Convert.ToUInt32((int)input));
  635. JsonMapper.RegisterImporter(JsonMapper.base_importers_table, typeof(int), typeof(uint), importer);
  636. importer = ((object input) => Convert.ToSingle((int)input));
  637. JsonMapper.RegisterImporter(JsonMapper.base_importers_table, typeof(int), typeof(float), importer);
  638. importer = ((object input) => Convert.ToDouble((int)input));
  639. JsonMapper.RegisterImporter(JsonMapper.base_importers_table, typeof(int), typeof(double), importer);
  640. importer = ((object input) => Convert.ToDecimal((double)input));
  641. JsonMapper.RegisterImporter(JsonMapper.base_importers_table, typeof(double), typeof(decimal), importer);
  642. importer = ((object input) => Convert.ToUInt32((long)input));
  643. JsonMapper.RegisterImporter(JsonMapper.base_importers_table, typeof(long), typeof(uint), importer);
  644. importer = ((object input) => Convert.ToChar((string)input));
  645. JsonMapper.RegisterImporter(JsonMapper.base_importers_table, typeof(string), typeof(char), importer);
  646. importer = ((object input) => Convert.ToDateTime((string)input, JsonMapper.datetime_format));
  647. JsonMapper.RegisterImporter(JsonMapper.base_importers_table, typeof(string), typeof(DateTime), importer);
  648. }
  649. private static void RegisterImporter(IDictionary<Type, IDictionary<Type, ImporterFunc>> table, Type json_type, Type value_type, ImporterFunc importer)
  650. {
  651. if (!table.ContainsKey(json_type))
  652. {
  653. table.Add(json_type, new Dictionary<Type, ImporterFunc>());
  654. }
  655. table[json_type][value_type] = importer;
  656. }
  657. private static void WriteValue(object obj, JsonWriter writer, bool writer_is_private, int depth)
  658. {
  659. if (depth > JsonMapper.max_nesting_depth)
  660. {
  661. throw new JsonException(string.Format("Max allowed object depth reached while trying to export from type {0}", obj.GetType()));
  662. }
  663. if (obj == null)
  664. {
  665. writer.Write(null);
  666. return;
  667. }
  668. if (obj is IJsonWrapper)
  669. {
  670. if (writer_is_private)
  671. {
  672. writer.TextWriter.Write(((IJsonWrapper)obj).ToJson());
  673. }
  674. else
  675. {
  676. ((IJsonWrapper)obj).ToJson(writer);
  677. }
  678. return;
  679. }
  680. if (obj is string)
  681. {
  682. writer.Write((string)obj);
  683. return;
  684. }
  685. if (obj is double)
  686. {
  687. writer.Write((double)obj);
  688. return;
  689. }
  690. if (obj is float)
  691. {
  692. writer.Write((double)((float)obj));
  693. return;
  694. }
  695. if (obj is int)
  696. {
  697. writer.Write((int)obj);
  698. return;
  699. }
  700. if (obj is bool)
  701. {
  702. writer.Write((bool)obj);
  703. return;
  704. }
  705. if (obj is long)
  706. {
  707. writer.Write((long)obj);
  708. return;
  709. }
  710. if (obj is Array)
  711. {
  712. writer.WriteArrayStart();
  713. IEnumerator enumerator = ((Array)obj).GetEnumerator();
  714. try
  715. {
  716. while (enumerator.MoveNext())
  717. {
  718. object obj2 = enumerator.Current;
  719. JsonMapper.WriteValue(obj2, writer, writer_is_private, depth + 1);
  720. }
  721. }
  722. finally
  723. {
  724. IDisposable disposable;
  725. if ((disposable = (enumerator as IDisposable)) != null)
  726. {
  727. disposable.Dispose();
  728. }
  729. }
  730. writer.WriteArrayEnd();
  731. return;
  732. }
  733. if (obj is IList)
  734. {
  735. writer.WriteArrayStart();
  736. IEnumerator enumerator2 = ((IList)obj).GetEnumerator();
  737. try
  738. {
  739. while (enumerator2.MoveNext())
  740. {
  741. object obj3 = enumerator2.Current;
  742. JsonMapper.WriteValue(obj3, writer, writer_is_private, depth + 1);
  743. }
  744. }
  745. finally
  746. {
  747. IDisposable disposable2;
  748. if ((disposable2 = (enumerator2 as IDisposable)) != null)
  749. {
  750. disposable2.Dispose();
  751. }
  752. }
  753. writer.WriteArrayEnd();
  754. return;
  755. }
  756. if (obj is IDictionary)
  757. {
  758. writer.WriteObjectStart();
  759. IDictionaryEnumerator enumerator3 = ((IDictionary)obj).GetEnumerator();
  760. try
  761. {
  762. while (enumerator3.MoveNext())
  763. {
  764. object obj4 = enumerator3.Current;
  765. DictionaryEntry dictionaryEntry = (DictionaryEntry)obj4;
  766. writer.WritePropertyName((string)dictionaryEntry.Key);
  767. JsonMapper.WriteValue(dictionaryEntry.Value, writer, writer_is_private, depth + 1);
  768. }
  769. }
  770. finally
  771. {
  772. IDisposable disposable3;
  773. if ((disposable3 = (enumerator3 as IDisposable)) != null)
  774. {
  775. disposable3.Dispose();
  776. }
  777. }
  778. writer.WriteObjectEnd();
  779. return;
  780. }
  781. Type type = obj.GetType();
  782. if (JsonMapper.custom_exporters_table.ContainsKey(type))
  783. {
  784. ExporterFunc exporterFunc = JsonMapper.custom_exporters_table[type];
  785. exporterFunc(obj, writer);
  786. return;
  787. }
  788. if (JsonMapper.base_exporters_table.ContainsKey(type))
  789. {
  790. ExporterFunc exporterFunc2 = JsonMapper.base_exporters_table[type];
  791. exporterFunc2(obj, writer);
  792. return;
  793. }
  794. if (obj is Enum)
  795. {
  796. Type underlyingType = Enum.GetUnderlyingType(type);
  797. if (underlyingType == typeof(long) || underlyingType == typeof(uint) || underlyingType == typeof(ulong))
  798. {
  799. writer.Write((ulong)obj);
  800. }
  801. else
  802. {
  803. writer.Write((int)obj);
  804. }
  805. return;
  806. }
  807. JsonMapper.AddTypeProperties(type);
  808. IList<PropertyMetadata> list = JsonMapper.type_properties[type];
  809. writer.WriteObjectStart();
  810. foreach (PropertyMetadata propertyMetadata in list)
  811. {
  812. if (propertyMetadata.IsField)
  813. {
  814. writer.WritePropertyName(propertyMetadata.Info.Name);
  815. JsonMapper.WriteValue(((FieldInfo)propertyMetadata.Info).GetValue(obj), writer, writer_is_private, depth + 1);
  816. }
  817. else
  818. {
  819. PropertyInfo propertyInfo = (PropertyInfo)propertyMetadata.Info;
  820. if (propertyInfo.CanRead)
  821. {
  822. writer.WritePropertyName(propertyMetadata.Info.Name);
  823. JsonMapper.WriteValue(propertyInfo.GetValue(obj, null), writer, writer_is_private, depth + 1);
  824. }
  825. }
  826. }
  827. writer.WriteObjectEnd();
  828. }
  829. public static string ToJson(object obj)
  830. {
  831. object obj2 = JsonMapper.static_writer_lock;
  832. string result;
  833. lock (obj2)
  834. {
  835. JsonMapper.static_writer.Reset();
  836. JsonMapper.WriteValue(obj, JsonMapper.static_writer, true, 0);
  837. result = JsonMapper.static_writer.ToString();
  838. }
  839. return result;
  840. }
  841. public static void ToJson(object obj, JsonWriter writer)
  842. {
  843. JsonMapper.WriteValue(obj, writer, false, 0);
  844. }
  845. public static JsonData ToObject(JsonReader reader)
  846. {
  847. return (JsonData)JsonMapper.ToWrapper(() => new JsonData(), reader);
  848. }
  849. public static JsonData ToObject(TextReader reader)
  850. {
  851. JsonReader reader2 = new JsonReader(reader);
  852. return (JsonData)JsonMapper.ToWrapper(() => new JsonData(), reader2);
  853. }
  854. public static JsonData ToObject(string json)
  855. {
  856. return (JsonData)JsonMapper.ToWrapper(() => new JsonData(), json);
  857. }
  858. public static T ToObject<T>(JsonReader reader)
  859. {
  860. return (T)((object)JsonMapper.ReadValue(typeof(T), reader));
  861. }
  862. public static T ToObject<T>(TextReader reader)
  863. {
  864. JsonReader reader2 = new JsonReader(reader);
  865. return (T)((object)JsonMapper.ReadValue(typeof(T), reader2));
  866. }
  867. public static T ToObject<T>(string json)
  868. {
  869. JsonReader reader = new JsonReader(json);
  870. return (T)((object)JsonMapper.ReadValue(typeof(T), reader));
  871. }
  872. public static IJsonWrapper ToWrapper(WrapperFactory factory, JsonReader reader)
  873. {
  874. return JsonMapper.ReadValue(factory, reader);
  875. }
  876. public static IJsonWrapper ToWrapper(WrapperFactory factory, string json)
  877. {
  878. JsonReader reader = new JsonReader(json);
  879. return JsonMapper.ReadValue(factory, reader);
  880. }
  881. public static void RegisterExporter<T>(ExporterFunc<T> exporter)
  882. {
  883. ExporterFunc value = delegate(object obj, JsonWriter writer)
  884. {
  885. exporter((T)((object)obj), writer);
  886. };
  887. JsonMapper.custom_exporters_table[typeof(T)] = value;
  888. }
  889. public static void RegisterImporter<TJson, TValue>(ImporterFunc<TJson, TValue> importer)
  890. {
  891. ImporterFunc importer2 = (object input) => importer((TJson)((object)input));
  892. JsonMapper.RegisterImporter(JsonMapper.custom_importers_table, typeof(TJson), typeof(TValue), importer2);
  893. }
  894. public static void UnregisterExporters()
  895. {
  896. JsonMapper.custom_exporters_table.Clear();
  897. }
  898. public static void UnregisterImporters()
  899. {
  900. JsonMapper.custom_importers_table.Clear();
  901. }
  902. private static int max_nesting_depth;
  903. private static IFormatProvider datetime_format;
  904. private static IDictionary<Type, ExporterFunc> base_exporters_table;
  905. private static IDictionary<Type, ExporterFunc> custom_exporters_table;
  906. private static IDictionary<Type, IDictionary<Type, ImporterFunc>> base_importers_table;
  907. private static IDictionary<Type, IDictionary<Type, ImporterFunc>> custom_importers_table;
  908. private static IDictionary<Type, ArrayMetadata> array_metadata;
  909. private static readonly object array_metadata_lock = new object();
  910. private static IDictionary<Type, IDictionary<Type, MethodInfo>> conv_ops;
  911. private static readonly object conv_ops_lock = new object();
  912. private static IDictionary<Type, ObjectMetadata> object_metadata;
  913. private static readonly object object_metadata_lock = new object();
  914. private static IDictionary<Type, IList<PropertyMetadata>> type_properties;
  915. private static readonly object type_properties_lock = new object();
  916. private static JsonWriter static_writer;
  917. private static readonly object static_writer_lock = new object();
  918. [CompilerGenerated]
  919. private static ExporterFunc _003C_003Ef__mg_0024cache0;
  920. [CompilerGenerated]
  921. private static ExporterFunc _003C_003Ef__mg_0024cache1;
  922. [CompilerGenerated]
  923. private static ExporterFunc _003C_003Ef__mg_0024cache2;
  924. [CompilerGenerated]
  925. private static ExporterFunc _003C_003Ef__mg_0024cache3;
  926. [CompilerGenerated]
  927. private static ExporterFunc _003C_003Ef__mg_0024cache4;
  928. [CompilerGenerated]
  929. private static ExporterFunc _003C_003Ef__mg_0024cache5;
  930. [CompilerGenerated]
  931. private static ExporterFunc _003C_003Ef__mg_0024cache6;
  932. [CompilerGenerated]
  933. private static ExporterFunc _003C_003Ef__mg_0024cache7;
  934. [CompilerGenerated]
  935. private static ExporterFunc _003C_003Ef__mg_0024cache8;
  936. }
  937. }