using System; using System.Collections; using System.Collections.Generic; using System.Globalization; using System.Text; namespace Prime31 { // Token: 0x0200001A RID: 26 public class SimpleJson { // Token: 0x17000008 RID: 8 // (get) Token: 0x0600008D RID: 141 RVA: 0x00006384 File Offset: 0x00004584 // (set) Token: 0x0600008E RID: 142 RVA: 0x000063B0 File Offset: 0x000045B0 public static IJsonSerializerStrategy currentJsonSerializerStrategy { get { IJsonSerializerStrategy result; if ((result = SimpleJson._currentJsonSerializerStrategy) == null) { result = (SimpleJson._currentJsonSerializerStrategy = SimpleJson.pocoJsonSerializerStrategy); } return result; } set { SimpleJson.currentJsonSerializerStrategy = value; } } // Token: 0x17000009 RID: 9 // (get) Token: 0x0600008F RID: 143 RVA: 0x000063BC File Offset: 0x000045BC public static PocoJsonSerializerStrategy pocoJsonSerializerStrategy { get { PocoJsonSerializerStrategy result; if ((result = SimpleJson._pocoJsonSerializerStrategy) == null) { result = (SimpleJson._pocoJsonSerializerStrategy = new PocoJsonSerializerStrategy()); } return result; } } // Token: 0x06000091 RID: 145 RVA: 0x000063F0 File Offset: 0x000045F0 public static string encode(object obj) { StringBuilder stringBuilder = new StringBuilder(2000); bool flag = SimpleJson.serializeValue(SimpleJson.currentJsonSerializerStrategy, obj, stringBuilder); return (!flag) ? null : stringBuilder.ToString(); } // Token: 0x06000092 RID: 146 RVA: 0x00006430 File Offset: 0x00004630 public static bool tryDeserializeObject(string json, out object obj) { bool result = true; if (json != null) { char[] json2 = json.ToCharArray(); int num = 0; obj = SimpleJson.parseValue(json2, ref num, ref result); } else { obj = null; } return result; } // Token: 0x06000093 RID: 147 RVA: 0x00006470 File Offset: 0x00004670 public static object decode(string json) { object obj; object result; if (SimpleJson.tryDeserializeObject(json, out obj)) { result = obj; } else { Utils.logObject("Something went wrong deserializing the json. We got a null return. Here is the json we tried to deserialize: " + json); result = null; } return result; } // Token: 0x06000094 RID: 148 RVA: 0x000064B0 File Offset: 0x000046B0 private static object decode(string json, Type type) { return SimpleJson.decode(json, type, null); } // Token: 0x06000095 RID: 149 RVA: 0x000064D0 File Offset: 0x000046D0 public static T decode(string json) { return (T)((object)SimpleJson.decode(json, typeof(T))); } // Token: 0x06000096 RID: 150 RVA: 0x000064FC File Offset: 0x000046FC public static T decode(string json, string rootElement) where T : new() { return (T)((object)SimpleJson.decode(json, typeof(T), rootElement)); } // Token: 0x06000097 RID: 151 RVA: 0x00006528 File Offset: 0x00004728 private static object decode(string json, Type type, string rootElement = null) { object obj = SimpleJson.decode(json); object result; if (type == null || (obj != null && obj.GetType().IsAssignableFrom(type))) { result = obj; } else { if (rootElement != null) { if (obj is JsonObject) { JsonObject jsonObject = obj as JsonObject; if (jsonObject.ContainsKey(rootElement)) { obj = jsonObject[rootElement]; } else { Utils.logObject(string.Format("A rootElement was requested ({0}) but does not exist in the decoded Dictionary", rootElement)); } } else { Utils.logObject(string.Format("A rootElement was requested ({0}) but the decoded object is not a Dictionary. It is a {1}", rootElement, obj.GetType())); } } result = SimpleJson.currentJsonSerializerStrategy.deserializeObject(obj, type); } return result; } // Token: 0x06000098 RID: 152 RVA: 0x000065D8 File Offset: 0x000047D8 public static T decodeObject(object jsonObject, string rootElement = null) { Type typeFromHandle = typeof(T); T result; if (typeFromHandle == null || (jsonObject != null && jsonObject.GetType().IsAssignableFrom(typeFromHandle))) { result = (T)((object)jsonObject); } else { if (rootElement != null) { if (jsonObject is Dictionary) { Dictionary dictionary = jsonObject as Dictionary; if (dictionary.ContainsKey(rootElement)) { jsonObject = dictionary[rootElement]; } else { Utils.logObject(string.Format("A rootElement was requested ({0}) but does not exist in the decoded Dictionary", rootElement)); } } else { Utils.logObject(string.Format("A rootElement was requested ({0}) but the decoded object is not a Dictionary. It is a {1}", rootElement, jsonObject.GetType())); } } result = (T)((object)SimpleJson.currentJsonSerializerStrategy.deserializeObject(jsonObject, typeFromHandle)); } return result; } // Token: 0x06000099 RID: 153 RVA: 0x00006698 File Offset: 0x00004898 protected static IDictionary parseObject(char[] json, ref int index, ref bool success) { IDictionary dictionary = new JsonObject(); SimpleJson.nextToken(json, ref index); bool flag = false; while (!flag) { int num = SimpleJson.lookAhead(json, index); if (num != 0) { if (num == 6) { SimpleJson.nextToken(json, ref index); } else { if (num == 2) { SimpleJson.nextToken(json, ref index); return dictionary; } string key = SimpleJson.parseString(json, ref index, ref success); if (!success) { success = false; return null; } num = SimpleJson.nextToken(json, ref index); if (num != 5) { success = false; return null; } object value = SimpleJson.parseValue(json, ref index, ref success); if (!success) { success = false; return null; } dictionary[key] = value; } continue; } success = false; return null; } return dictionary; } // Token: 0x0600009A RID: 154 RVA: 0x00006770 File Offset: 0x00004970 protected static JsonArray parseArray(char[] json, ref int index, ref bool success) { JsonArray jsonArray = new JsonArray(); SimpleJson.nextToken(json, ref index); bool flag = false; while (!flag) { int num = SimpleJson.lookAhead(json, index); if (num != 0) { if (num == 6) { SimpleJson.nextToken(json, ref index); } else { if (num == 4) { SimpleJson.nextToken(json, ref index); break; } object item = SimpleJson.parseValue(json, ref index, ref success); if (!success) { return null; } jsonArray.Add(item); } continue; } success = false; return null; } return jsonArray; } // Token: 0x0600009B RID: 155 RVA: 0x00006808 File Offset: 0x00004A08 protected static object parseValue(char[] json, ref int index, ref bool success) { switch (SimpleJson.lookAhead(json, index)) { case 1: return SimpleJson.parseObject(json, ref index, ref success); case 3: return SimpleJson.parseArray(json, ref index, ref success); case 7: return SimpleJson.parseString(json, ref index, ref success); case 8: return SimpleJson.parseNumber(json, ref index, ref success); case 9: SimpleJson.nextToken(json, ref index); return true; case 10: SimpleJson.nextToken(json, ref index); return false; case 11: SimpleJson.nextToken(json, ref index); return null; } success = false; return null; } // Token: 0x0600009C RID: 156 RVA: 0x000068DC File Offset: 0x00004ADC protected static string parseString(char[] json, ref int index, ref bool success) { StringBuilder stringBuilder = new StringBuilder(2000); SimpleJson.eatWhitespace(json, ref index); char c = json[index++]; bool flag = false; while (!flag) { if (index == json.Length) { break; } c = json[index++]; if (c == '"') { flag = true; break; } if (c == '\\') { if (index == json.Length) { break; } c = json[index++]; if (c == '"') { stringBuilder.Append('"'); } else if (c == '\\') { stringBuilder.Append('\\'); } else if (c == '/') { stringBuilder.Append('/'); } else if (c == 'b') { stringBuilder.Append('\b'); } else if (c == 'f') { stringBuilder.Append('\f'); } else if (c == 'n') { stringBuilder.Append('\n'); } else if (c == 'r') { stringBuilder.Append('\r'); } else if (c == 't') { stringBuilder.Append('\t'); } else if (c == 'u') { int num = json.Length - index; if (num >= 4) { uint num2; string result; if (!(success = uint.TryParse(new string(json, index, 4), NumberStyles.HexNumber, CultureInfo.InvariantCulture, out num2))) { result = ""; } else { if (55296U > num2 || num2 > 56319U) { stringBuilder.Append(char.ConvertFromUtf32((int)num2)); index += 4; continue; } index += 4; num = json.Length - index; if (num >= 6) { uint num3; if (new string(json, index, 2) == "\\u" && uint.TryParse(new string(json, index + 2, 4), NumberStyles.HexNumber, CultureInfo.InvariantCulture, out num3)) { if (56320U <= num3 && num3 <= 57343U) { stringBuilder.Append((char)num2); stringBuilder.Append((char)num3); index += 6; continue; } } } success = false; result = ""; } return result; } break; } } else { stringBuilder.Append(c); } } if (!flag) { success = false; return null; } return stringBuilder.ToString(); } // Token: 0x0600009D RID: 157 RVA: 0x00006B64 File Offset: 0x00004D64 protected static object parseNumber(char[] json, ref int index, ref bool success) { SimpleJson.eatWhitespace(json, ref index); int lastIndexOfNumber = SimpleJson.getLastIndexOfNumber(json, index); int length = lastIndexOfNumber - index + 1; string text = new string(json, index, length); object result; if (text.IndexOf(".", StringComparison.OrdinalIgnoreCase) != -1 || text.IndexOf("e", StringComparison.OrdinalIgnoreCase) != -1) { double num; success = double.TryParse(new string(json, index, length), NumberStyles.Any, CultureInfo.InvariantCulture, out num); result = num; } else { long num2; success = long.TryParse(new string(json, index, length), NumberStyles.Any, CultureInfo.InvariantCulture, out num2); result = num2; } index = lastIndexOfNumber + 1; return result; } // Token: 0x0600009E RID: 158 RVA: 0x00006C18 File Offset: 0x00004E18 protected static int getLastIndexOfNumber(char[] json, int index) { int i; for (i = index; i < json.Length; i++) { if ("0123456789+-.eE".IndexOf(json[i]) == -1) { break; } } return i - 1; } // Token: 0x0600009F RID: 159 RVA: 0x00006C5C File Offset: 0x00004E5C protected static void eatWhitespace(char[] json, ref int index) { while (index < json.Length) { if (" \t\n\r\b\f".IndexOf(json[index]) == -1) { break; } index++; } } // Token: 0x060000A0 RID: 160 RVA: 0x00006C90 File Offset: 0x00004E90 protected static int lookAhead(char[] json, int index) { int num = index; return SimpleJson.nextToken(json, ref num); } // Token: 0x060000A1 RID: 161 RVA: 0x00006CB0 File Offset: 0x00004EB0 protected static int nextToken(char[] json, ref int index) { SimpleJson.eatWhitespace(json, ref index); int result; if (index == json.Length) { result = 0; } else { char c = json[index]; index++; switch (c) { case ',': result = 6; break; case '-': case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': result = 8; break; default: switch (c) { case '[': result = 3; break; default: switch (c) { case '{': result = 1; break; default: if (c != '"') { index--; int num = json.Length - index; if (num >= 5) { if (json[index] == 'f' && json[index + 1] == 'a' && json[index + 2] == 'l' && json[index + 3] == 's' && json[index + 4] == 'e') { index += 5; result = 10; break; } } if (num >= 4) { if (json[index] == 't' && json[index + 1] == 'r' && json[index + 2] == 'u' && json[index + 3] == 'e') { index += 4; result = 9; break; } } if (num >= 4) { if (json[index] == 'n' && json[index + 1] == 'u' && json[index + 2] == 'l' && json[index + 3] == 'l') { index += 4; result = 11; break; } } result = 0; } else { result = 7; } break; case '}': result = 2; break; } break; case ']': result = 4; break; } break; case ':': result = 5; break; } } return result; } // Token: 0x060000A2 RID: 162 RVA: 0x00006E98 File Offset: 0x00005098 protected static bool serializeValue(IJsonSerializerStrategy jsonSerializerStrategy, object value, StringBuilder builder) { bool flag = true; if (value is string) { flag = SimpleJson.serializeString((string)value, builder); } else if (value is IDictionary) { IDictionary dictionary = (IDictionary)value; flag = SimpleJson.serializeObject(jsonSerializerStrategy, dictionary.Keys, dictionary.Values, builder); } else if (value is IDictionary) { IDictionary dictionary2 = (IDictionary)value; flag = SimpleJson.serializeObject(jsonSerializerStrategy, dictionary2.Keys, dictionary2.Values, builder); } else if (value is IDictionary) { IDictionary dictionary3 = (IDictionary)value; flag = SimpleJson.serializeObject(jsonSerializerStrategy, dictionary3.Keys, dictionary3.Values, builder); } else if (value is IEnumerable) { flag = SimpleJson.serializeArray(jsonSerializerStrategy, (IEnumerable)value, builder); } else if (SimpleJson.isNumeric(value)) { flag = SimpleJson.serializeNumber(value, builder); } else if (value is bool) { builder.Append((!(bool)value) ? "false" : "true"); } else if (value == null) { builder.Append("null"); } else { object value2; flag = jsonSerializerStrategy.serializeNonPrimitiveObject(value, out value2); if (flag) { SimpleJson.serializeValue(jsonSerializerStrategy, value2, builder); } } return flag; } // Token: 0x060000A3 RID: 163 RVA: 0x00006FF0 File Offset: 0x000051F0 protected static bool serializeObject(IJsonSerializerStrategy jsonSerializerStrategy, IEnumerable keys, IEnumerable values, StringBuilder builder) { builder.Append("{"); IEnumerator enumerator = keys.GetEnumerator(); IEnumerator enumerator2 = values.GetEnumerator(); bool flag = true; while (enumerator.MoveNext() && enumerator2.MoveNext()) { object obj = enumerator.Current; object value = enumerator2.Current; if (!flag) { builder.Append(","); } if (obj is string) { SimpleJson.serializeString((string)obj, builder); } else if (!SimpleJson.serializeValue(jsonSerializerStrategy, value, builder)) { return false; } builder.Append(":"); if (SimpleJson.serializeValue(jsonSerializerStrategy, value, builder)) { flag = false; continue; } return false; } builder.Append("}"); return true; } // Token: 0x060000A4 RID: 164 RVA: 0x000070C8 File Offset: 0x000052C8 protected static bool serializeArray(IJsonSerializerStrategy jsonSerializerStrategy, IEnumerable anArray, StringBuilder builder) { builder.Append("["); bool flag = true; IEnumerator enumerator = anArray.GetEnumerator(); try { while (enumerator.MoveNext()) { object value = enumerator.Current; if (!flag) { builder.Append(","); } if (!SimpleJson.serializeValue(jsonSerializerStrategy, value, builder)) { return false; } flag = false; } } finally { IDisposable disposable; if ((disposable = (enumerator as IDisposable)) != null) { disposable.Dispose(); } } builder.Append("]"); return true; } // Token: 0x060000A5 RID: 165 RVA: 0x0000716C File Offset: 0x0000536C protected static bool serializeString(string aString, StringBuilder builder) { builder.Append("\""); foreach (char c in aString.ToCharArray()) { if (c == '"') { builder.Append("\\\""); } else if (c == '\\') { builder.Append("\\\\"); } else if (c == '\b') { builder.Append("\\b"); } else if (c == '\f') { builder.Append("\\f"); } else if (c == '\n') { builder.Append("\\n"); } else if (c == '\r') { builder.Append("\\r"); } else if (c == '\t') { builder.Append("\\t"); } else { builder.Append(c); } } builder.Append("\""); return true; } // Token: 0x060000A6 RID: 166 RVA: 0x00007274 File Offset: 0x00005474 protected static bool serializeNumber(object number, StringBuilder builder) { if (number is long) { builder.Append(((long)number).ToString(CultureInfo.InvariantCulture)); } else if (number is ulong) { builder.Append(((ulong)number).ToString(CultureInfo.InvariantCulture)); } else if (number is int) { builder.Append(((int)number).ToString(CultureInfo.InvariantCulture)); } else if (number is uint) { builder.Append(((uint)number).ToString(CultureInfo.InvariantCulture)); } else if (number is decimal) { builder.Append(((decimal)number).ToString(CultureInfo.InvariantCulture)); } else if (number is float) { builder.Append(((float)number).ToString(CultureInfo.InvariantCulture)); } else { builder.Append(Convert.ToDouble(number, CultureInfo.InvariantCulture).ToString("r", CultureInfo.InvariantCulture)); } return true; } // Token: 0x060000A7 RID: 167 RVA: 0x000073C0 File Offset: 0x000055C0 protected static bool isNumeric(object value) { return value is sbyte || value is byte || value is short || value is ushort || value is int || value is uint || value is long || value is ulong || value is float || value is double || value is decimal; } // Token: 0x04000040 RID: 64 private const int TOKEN_NONE = 0; // Token: 0x04000041 RID: 65 private const int TOKEN_CURLY_OPEN = 1; // Token: 0x04000042 RID: 66 private const int TOKEN_CURLY_CLOSE = 2; // Token: 0x04000043 RID: 67 private const int TOKEN_SQUARED_OPEN = 3; // Token: 0x04000044 RID: 68 private const int TOKEN_SQUARED_CLOSE = 4; // Token: 0x04000045 RID: 69 private const int TOKEN_COLON = 5; // Token: 0x04000046 RID: 70 private const int TOKEN_COMMA = 6; // Token: 0x04000047 RID: 71 private const int TOKEN_STRING = 7; // Token: 0x04000048 RID: 72 private const int TOKEN_NUMBER = 8; // Token: 0x04000049 RID: 73 private const int TOKEN_TRUE = 9; // Token: 0x0400004A RID: 74 private const int TOKEN_FALSE = 10; // Token: 0x0400004B RID: 75 private const int TOKEN_NULL = 11; // Token: 0x0400004C RID: 76 private const int BUILDER_CAPACITY = 2000; // Token: 0x0400004D RID: 77 private static IJsonSerializerStrategy _currentJsonSerializerStrategy; // Token: 0x0400004E RID: 78 private static PocoJsonSerializerStrategy _pocoJsonSerializerStrategy; } }