|
|
|
|
|
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<T>(string json)
|
|
|
|
|
|
{
|
|
|
|
|
|
return (T)((object)SimpleJson.decode(json, typeof(T)));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Token: 0x06000096 RID: 150 RVA: 0x000064FC File Offset: 0x000046FC
|
|
|
|
|
|
public static T decode<T>(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<T>(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<string, object>)
|
|
|
|
|
|
{
|
|
|
|
|
|
Dictionary<string, object> dictionary = jsonObject as Dictionary<string, object>;
|
|
|
|
|
|
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<string, object> parseObject(char[] json, ref int index, ref bool success)
|
|
|
|
|
|
{
|
|
|
|
|
|
IDictionary<string, object> 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<string, object>)
|
|
|
|
|
|
{
|
|
|
|
|
|
IDictionary<string, object> dictionary = (IDictionary<string, object>)value;
|
|
|
|
|
|
flag = SimpleJson.serializeObject(jsonSerializerStrategy, dictionary.Keys, dictionary.Values, builder);
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (value is IDictionary<string, string>)
|
|
|
|
|
|
{
|
|
|
|
|
|
IDictionary<string, string> dictionary2 = (IDictionary<string, string>)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;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|