1398 lines
		
	
	
		
			30 KiB
		
	
	
	
		
			C#
		
	
	
	
		
		
			
		
	
	
			1398 lines
		
	
	
		
			30 KiB
		
	
	
	
		
			C#
		
	
	
	
| 
								 | 
							
								//#define USE_SharpZipLib
							 | 
						|||
| 
								 | 
							
								#if !UNITY_WEBPLAYER
							 | 
						|||
| 
								 | 
							
								#define USE_FileIO
							 | 
						|||
| 
								 | 
							
								#endif
							 | 
						|||
| 
								 | 
							
								/* * * * *
							 | 
						|||
| 
								 | 
							
								 * A simple JSON Parser / builder
							 | 
						|||
| 
								 | 
							
								 * ------------------------------
							 | 
						|||
| 
								 | 
							
								 * 
							 | 
						|||
| 
								 | 
							
								 * It mainly has been written as a simple JSON parser. It can build a JSON string
							 | 
						|||
| 
								 | 
							
								 * from the node-tree, or generate a node tree from any valid JSON string.
							 | 
						|||
| 
								 | 
							
								 * 
							 | 
						|||
| 
								 | 
							
								 * If you want to use compression when saving to file / stream / B64 you have to include
							 | 
						|||
| 
								 | 
							
								 * SharpZipLib ( http://www.icsharpcode.net/opensource/sharpziplib/ ) in your project and
							 | 
						|||
| 
								 | 
							
								 * define "USE_SharpZipLib" at the top of the file
							 | 
						|||
| 
								 | 
							
								 * 
							 | 
						|||
| 
								 | 
							
								 * Written by Bunny83 
							 | 
						|||
| 
								 | 
							
								 * 2012-06-09
							 | 
						|||
| 
								 | 
							
								 * 
							 | 
						|||
| 
								 | 
							
								 *
							 | 
						|||
| 
								 | 
							
								 * Features / attributes:
							 | 
						|||
| 
								 | 
							
								 * - provides strongly typed node classes and lists / dictionaries
							 | 
						|||
| 
								 | 
							
								 * - provides easy access to class members / array items / data values
							 | 
						|||
| 
								 | 
							
								 * - the parser now properly identifies types. So generating JSON with this framework should work.
							 | 
						|||
| 
								 | 
							
								 * - only double quotes (") are used for quoting strings.
							 | 
						|||
| 
								 | 
							
								 * - provides "casting" properties to easily convert to / from those types:
							 | 
						|||
| 
								 | 
							
								 *   int / float / double / bool
							 | 
						|||
| 
								 | 
							
								 * - provides a common interface for each node so no explicit casting is required.
							 | 
						|||
| 
								 | 
							
								 * - the parser tries to avoid errors, but if malformed JSON is parsed the result is more or less undefined
							 | 
						|||
| 
								 | 
							
								 * - It can serialize/deserialize a node tree into/from an experimental compact binary format. It might
							 | 
						|||
| 
								 | 
							
								 *   be handy if you want to store things in a file and don't want it to be easily modifiable
							 | 
						|||
| 
								 | 
							
								 * 
							 | 
						|||
| 
								 | 
							
								 * 
							 | 
						|||
| 
								 | 
							
								 * 2012-12-17 Update:
							 | 
						|||
| 
								 | 
							
								 * - Added internal JSONLazyCreator class which simplifies the construction of a JSON tree
							 | 
						|||
| 
								 | 
							
								 *   Now you can simple reference any item that doesn't exist yet and it will return a JSONLazyCreator
							 | 
						|||
| 
								 | 
							
								 *   The class determines the required type by it's further use, creates the type and removes itself.
							 | 
						|||
| 
								 | 
							
								 * - Added binary serialization / deserialization.
							 | 
						|||
| 
								 | 
							
								 * - Added support for BZip2 zipped binary format. Requires the SharpZipLib ( http://www.icsharpcode.net/opensource/sharpziplib/ )
							 | 
						|||
| 
								 | 
							
								 *   The usage of the SharpZipLib library can be disabled by removing or commenting out the USE_SharpZipLib define at the top
							 | 
						|||
| 
								 | 
							
								 * - The serializer uses different types when it comes to store the values. Since my data values
							 | 
						|||
| 
								 | 
							
								 *   are all of type string, the serializer will "try" which format fits best. The order is: int, float, double, bool, string.
							 | 
						|||
| 
								 | 
							
								 *   It's not the most efficient way but for a moderate amount of data it should work on all platforms.
							 | 
						|||
| 
								 | 
							
								 * 
							 | 
						|||
| 
								 | 
							
								 * 2017-03-08 Update:
							 | 
						|||
| 
								 | 
							
								 * - Optimised parsing by using a StringBuilder for token. This prevents performance issues when large
							 | 
						|||
| 
								 | 
							
								 *   string data fields are contained in the json data.
							 | 
						|||
| 
								 | 
							
								 * - Finally refactored the badly named JSONClass into JSONObject.
							 | 
						|||
| 
								 | 
							
								 * - Replaced the old JSONData class by distict typed classes ( JSONString, JSONNumber, JSONBool, JSONNull ) this
							 | 
						|||
| 
								 | 
							
								 *   allows to propertly convert the node tree back to json without type information loss. The actual value
							 | 
						|||
| 
								 | 
							
								 *   parsing now happens at parsing time and not when you actually access one of the casting properties.
							 | 
						|||
| 
								 | 
							
								 * 
							 | 
						|||
| 
								 | 
							
								 * The MIT License (MIT)
							 | 
						|||
| 
								 | 
							
								 * 
							 | 
						|||
| 
								 | 
							
								 * Copyright (c) 2012-2017 Markus Göbel
							 | 
						|||
| 
								 | 
							
								 * 
							 | 
						|||
| 
								 | 
							
								 * Permission is hereby granted, free of charge, to any person obtaining a copy
							 | 
						|||
| 
								 | 
							
								 * of this software and associated documentation files (the "Software"), to deal
							 | 
						|||
| 
								 | 
							
								 * in the Software without restriction, including without limitation the rights
							 | 
						|||
| 
								 | 
							
								 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
							 | 
						|||
| 
								 | 
							
								 * copies of the Software, and to permit persons to whom the Software is
							 | 
						|||
| 
								 | 
							
								 * furnished to do so, subject to the following conditions:
							 | 
						|||
| 
								 | 
							
								 * 
							 | 
						|||
| 
								 | 
							
								 * The above copyright notice and this permission notice shall be included in all
							 | 
						|||
| 
								 | 
							
								 * copies or substantial portions of the Software.
							 | 
						|||
| 
								 | 
							
								 * 
							 | 
						|||
| 
								 | 
							
								 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
							 | 
						|||
| 
								 | 
							
								 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
							 | 
						|||
| 
								 | 
							
								 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
							 | 
						|||
| 
								 | 
							
								 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
							 | 
						|||
| 
								 | 
							
								 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
							 | 
						|||
| 
								 | 
							
								 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
							 | 
						|||
| 
								 | 
							
								 * SOFTWARE.
							 | 
						|||
| 
								 | 
							
								 * 
							 | 
						|||
| 
								 | 
							
								 * * * * */
							 | 
						|||
| 
								 | 
							
								using System;
							 | 
						|||
| 
								 | 
							
								using System.Collections;
							 | 
						|||
| 
								 | 
							
								using System.Collections.Generic;
							 | 
						|||
| 
								 | 
							
								using System.Linq;
							 | 
						|||
| 
								 | 
							
								using System.Text;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								namespace Umeng
							 | 
						|||
| 
								 | 
							
								{
							 | 
						|||
| 
								 | 
							
									public enum JSONNodeType
							 | 
						|||
| 
								 | 
							
									{
							 | 
						|||
| 
								 | 
							
										Array = 1,
							 | 
						|||
| 
								 | 
							
										Object = 2,
							 | 
						|||
| 
								 | 
							
										String = 3,
							 | 
						|||
| 
								 | 
							
										Number = 4,
							 | 
						|||
| 
								 | 
							
										NullValue = 5,
							 | 
						|||
| 
								 | 
							
										Boolean = 6,
							 | 
						|||
| 
								 | 
							
										None = 7,
							 | 
						|||
| 
								 | 
							
									}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
									public abstract partial class JSONNode
							 | 
						|||
| 
								 | 
							
									{
							 | 
						|||
| 
								 | 
							
										#region common interface
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public virtual JSONNode this[int aIndex] { get { return null; } set { } }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public virtual JSONNode this[string aKey] { get { return null; } set { } }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public virtual string Value { get { return ""; } set { } }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public virtual int Count { get { return 0; } }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public virtual bool IsNumber { get { return false; } }
							 | 
						|||
| 
								 | 
							
										public virtual bool IsString { get { return false; } }
							 | 
						|||
| 
								 | 
							
										public virtual bool IsBoolean { get { return false; } }
							 | 
						|||
| 
								 | 
							
										public virtual bool IsNull { get { return false; } }
							 | 
						|||
| 
								 | 
							
										public virtual bool IsArray { get { return false; } }
							 | 
						|||
| 
								 | 
							
										public virtual bool IsObject { get { return false; } }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public virtual void Add(string aKey, JSONNode aItem)
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
										public virtual void Add(JSONNode aItem)
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											Add("", aItem);
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public virtual JSONNode Remove(string aKey)
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											return null;
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public virtual JSONNode Remove(int aIndex)
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											return null;
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public virtual JSONNode Remove(JSONNode aNode)
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											return aNode;
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public virtual IEnumerable<JSONNode> Children
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											get
							 | 
						|||
| 
								 | 
							
											{
							 | 
						|||
| 
								 | 
							
												yield break;
							 | 
						|||
| 
								 | 
							
											}
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public IEnumerable<JSONNode> DeepChildren
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											get
							 | 
						|||
| 
								 | 
							
											{
							 | 
						|||
| 
								 | 
							
												foreach (var C in Children)
							 | 
						|||
| 
								 | 
							
													foreach (var D in C.DeepChildren)
							 | 
						|||
| 
								 | 
							
														yield return D;
							 | 
						|||
| 
								 | 
							
											}
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public override string ToString()
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											return "JSONNode";
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public virtual string ToString(string aIndent)
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											return ToString(aIndent, "");
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										internal abstract string ToString(string aIndent, string aPrefix);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										#endregion common interface
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										#region typecasting properties
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public abstract JSONNodeType Tag { get; }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public virtual double AsDouble
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											get
							 | 
						|||
| 
								 | 
							
											{
							 | 
						|||
| 
								 | 
							
												double v = 0.0;
							 | 
						|||
| 
								 | 
							
												if (double.TryParse(Value, out v))
							 | 
						|||
| 
								 | 
							
													return v;
							 | 
						|||
| 
								 | 
							
												return 0.0;
							 | 
						|||
| 
								 | 
							
											}
							 | 
						|||
| 
								 | 
							
											set
							 | 
						|||
| 
								 | 
							
											{
							 | 
						|||
| 
								 | 
							
												Value = value.ToString();
							 | 
						|||
| 
								 | 
							
											}
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public virtual int AsInt
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											get { return (int)AsDouble; }
							 | 
						|||
| 
								 | 
							
											set { AsDouble = value; }
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public virtual float AsFloat
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											get { return (float)AsDouble; }
							 | 
						|||
| 
								 | 
							
											set { AsDouble = value; }
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public virtual bool AsBool
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											get
							 | 
						|||
| 
								 | 
							
											{
							 | 
						|||
| 
								 | 
							
												bool v = false;
							 | 
						|||
| 
								 | 
							
												if (bool.TryParse(Value, out v))
							 | 
						|||
| 
								 | 
							
													return v;
							 | 
						|||
| 
								 | 
							
												return !string.IsNullOrEmpty(Value);
							 | 
						|||
| 
								 | 
							
											}
							 | 
						|||
| 
								 | 
							
											set
							 | 
						|||
| 
								 | 
							
											{
							 | 
						|||
| 
								 | 
							
												Value = (value) ? "true" : "false";
							 | 
						|||
| 
								 | 
							
											}
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public virtual JSONArray AsArray
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											get
							 | 
						|||
| 
								 | 
							
											{
							 | 
						|||
| 
								 | 
							
												return this as JSONArray;
							 | 
						|||
| 
								 | 
							
											}
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public virtual JSONObject AsObject
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											get
							 | 
						|||
| 
								 | 
							
											{
							 | 
						|||
| 
								 | 
							
												return this as JSONObject;
							 | 
						|||
| 
								 | 
							
											}
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										#endregion typecasting properties
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										#region operators
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public static implicit operator JSONNode(string s)
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											return new JSONString(s);
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
										public static implicit operator string(JSONNode d)
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											return (d == null) ? null : d.Value;
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public static implicit operator JSONNode(double n)
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											return new JSONNumber(n);
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
										public static implicit operator double(JSONNode d)
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											return (d == null) ? 0 : d.AsDouble;
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public static implicit operator JSONNode(float n)
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											return new JSONNumber(n);
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
										public static implicit operator float(JSONNode d)
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											return (d == null) ? 0 : d.AsFloat;
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public static implicit operator JSONNode(int n)
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											return new JSONNumber(n);
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
										public static implicit operator int(JSONNode d)
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											return (d == null) ? 0 : d.AsInt;
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public static implicit operator JSONNode(bool b)
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											return new JSONBool(b);
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
										public static implicit operator bool(JSONNode d)
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											return (d == null) ? false : d.AsBool;
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public static bool operator ==(JSONNode a, object b)
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											if (ReferenceEquals(a, b))
							 | 
						|||
| 
								 | 
							
												return true;
							 | 
						|||
| 
								 | 
							
											bool aIsNull = a is JSONNull || ReferenceEquals(a, null) || a is JSONLazyCreator;
							 | 
						|||
| 
								 | 
							
											bool bIsNull = b is JSONNull || ReferenceEquals(b, null) || b is JSONLazyCreator;
							 | 
						|||
| 
								 | 
							
											return (aIsNull && bIsNull);
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public static bool operator !=(JSONNode a, object b)
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											return !(a == b);
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public override bool Equals(object obj)
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											return System.Object.ReferenceEquals(this, obj);
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public override int GetHashCode()
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											return base.GetHashCode();
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										#endregion operators
							 | 
						|||
| 
								 | 
							
										internal static StringBuilder m_EscapeBuilder = new StringBuilder();
							 | 
						|||
| 
								 | 
							
										internal static string Escape(string aText)
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											m_EscapeBuilder.Length = 0;
							 | 
						|||
| 
								 | 
							
											if (m_EscapeBuilder.Capacity < aText.Length + aText.Length / 10)
							 | 
						|||
| 
								 | 
							
												m_EscapeBuilder.Capacity = aText.Length + aText.Length / 10;
							 | 
						|||
| 
								 | 
							
											foreach (char c in aText)
							 | 
						|||
| 
								 | 
							
											{
							 | 
						|||
| 
								 | 
							
												switch (c)
							 | 
						|||
| 
								 | 
							
												{
							 | 
						|||
| 
								 | 
							
												case '\\':
							 | 
						|||
| 
								 | 
							
													m_EscapeBuilder.Append("\\\\");
							 | 
						|||
| 
								 | 
							
													break;
							 | 
						|||
| 
								 | 
							
												case '\"':
							 | 
						|||
| 
								 | 
							
													m_EscapeBuilder.Append("\"");
							 | 
						|||
| 
								 | 
							
													break;
							 | 
						|||
| 
								 | 
							
												case '\n':
							 | 
						|||
| 
								 | 
							
													m_EscapeBuilder.Append("\\n");
							 | 
						|||
| 
								 | 
							
													break;
							 | 
						|||
| 
								 | 
							
												case '\r':
							 | 
						|||
| 
								 | 
							
													m_EscapeBuilder.Append("\\r");
							 | 
						|||
| 
								 | 
							
													break;
							 | 
						|||
| 
								 | 
							
												case '\t':
							 | 
						|||
| 
								 | 
							
													m_EscapeBuilder.Append("\\t");
							 | 
						|||
| 
								 | 
							
													break;
							 | 
						|||
| 
								 | 
							
												case '\b':
							 | 
						|||
| 
								 | 
							
													m_EscapeBuilder.Append("\\b");
							 | 
						|||
| 
								 | 
							
													break;
							 | 
						|||
| 
								 | 
							
												case '\f':
							 | 
						|||
| 
								 | 
							
													m_EscapeBuilder.Append("\\f");
							 | 
						|||
| 
								 | 
							
													break;
							 | 
						|||
| 
								 | 
							
												default:
							 | 
						|||
| 
								 | 
							
													m_EscapeBuilder.Append(c);
							 | 
						|||
| 
								 | 
							
													break;
							 | 
						|||
| 
								 | 
							
												}
							 | 
						|||
| 
								 | 
							
											}
							 | 
						|||
| 
								 | 
							
											string result = m_EscapeBuilder.ToString();
							 | 
						|||
| 
								 | 
							
											m_EscapeBuilder.Length = 0;
							 | 
						|||
| 
								 | 
							
											return result;
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										static void ParseElement(JSONNode ctx, string token, string tokenName, bool quoted)
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											if (quoted)
							 | 
						|||
| 
								 | 
							
											{
							 | 
						|||
| 
								 | 
							
												ctx.Add(tokenName, token);
							 | 
						|||
| 
								 | 
							
												return;
							 | 
						|||
| 
								 | 
							
											}
							 | 
						|||
| 
								 | 
							
											string tmp = token.ToLower();
							 | 
						|||
| 
								 | 
							
											if (tmp == "false" || tmp == "true")
							 | 
						|||
| 
								 | 
							
												ctx.Add(tokenName, tmp == "true");
							 | 
						|||
| 
								 | 
							
											else if (tmp == "null")
							 | 
						|||
| 
								 | 
							
												ctx.Add(tokenName, null);
							 | 
						|||
| 
								 | 
							
											else
							 | 
						|||
| 
								 | 
							
											{
							 | 
						|||
| 
								 | 
							
												double val;
							 | 
						|||
| 
								 | 
							
												if (double.TryParse(token, out val))
							 | 
						|||
| 
								 | 
							
													ctx.Add(tokenName, val);
							 | 
						|||
| 
								 | 
							
												else
							 | 
						|||
| 
								 | 
							
													ctx.Add(tokenName, token);
							 | 
						|||
| 
								 | 
							
											}
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public static JSONNode Parse(string aJSON)
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											Stack<JSONNode> stack = new Stack<JSONNode>();
							 | 
						|||
| 
								 | 
							
											JSONNode ctx = null;
							 | 
						|||
| 
								 | 
							
											int i = 0;
							 | 
						|||
| 
								 | 
							
											StringBuilder Token = new StringBuilder();
							 | 
						|||
| 
								 | 
							
											string TokenName = "";
							 | 
						|||
| 
								 | 
							
											bool QuoteMode = false;
							 | 
						|||
| 
								 | 
							
											bool TokenIsQuoted = false;
							 | 
						|||
| 
								 | 
							
											while (i < aJSON.Length)
							 | 
						|||
| 
								 | 
							
											{
							 | 
						|||
| 
								 | 
							
												switch (aJSON[i])
							 | 
						|||
| 
								 | 
							
												{
							 | 
						|||
| 
								 | 
							
												case '{':
							 | 
						|||
| 
								 | 
							
													if (QuoteMode)
							 | 
						|||
| 
								 | 
							
													{
							 | 
						|||
| 
								 | 
							
														Token.Append(aJSON[i]);
							 | 
						|||
| 
								 | 
							
														break;
							 | 
						|||
| 
								 | 
							
													}
							 | 
						|||
| 
								 | 
							
													stack.Push(new JSONObject());
							 | 
						|||
| 
								 | 
							
													if (ctx != null)
							 | 
						|||
| 
								 | 
							
													{
							 | 
						|||
| 
								 | 
							
														ctx.Add(TokenName, stack.Peek());
							 | 
						|||
| 
								 | 
							
													}
							 | 
						|||
| 
								 | 
							
													TokenName = "";
							 | 
						|||
| 
								 | 
							
													Token.Length = 0;
							 | 
						|||
| 
								 | 
							
													ctx = stack.Peek();
							 | 
						|||
| 
								 | 
							
													break;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
												case '[':
							 | 
						|||
| 
								 | 
							
													if (QuoteMode)
							 | 
						|||
| 
								 | 
							
													{
							 | 
						|||
| 
								 | 
							
														Token.Append(aJSON[i]);
							 | 
						|||
| 
								 | 
							
														break;
							 | 
						|||
| 
								 | 
							
													}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
													stack.Push(new JSONArray());
							 | 
						|||
| 
								 | 
							
													if (ctx != null)
							 | 
						|||
| 
								 | 
							
													{
							 | 
						|||
| 
								 | 
							
														ctx.Add(TokenName, stack.Peek());
							 | 
						|||
| 
								 | 
							
													}
							 | 
						|||
| 
								 | 
							
													TokenName = "";
							 | 
						|||
| 
								 | 
							
													Token.Length = 0;
							 | 
						|||
| 
								 | 
							
													ctx = stack.Peek();
							 | 
						|||
| 
								 | 
							
													break;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
												case '}':
							 | 
						|||
| 
								 | 
							
												case ']':
							 | 
						|||
| 
								 | 
							
													if (QuoteMode)
							 | 
						|||
| 
								 | 
							
													{
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
														Token.Append(aJSON[i]);
							 | 
						|||
| 
								 | 
							
														break;
							 | 
						|||
| 
								 | 
							
													}
							 | 
						|||
| 
								 | 
							
													if (stack.Count == 0)
							 | 
						|||
| 
								 | 
							
														throw new Exception("JSON Parse: Too many closing brackets");
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
													stack.Pop();
							 | 
						|||
| 
								 | 
							
													if (Token.Length > 0)
							 | 
						|||
| 
								 | 
							
													{
							 | 
						|||
| 
								 | 
							
														ParseElement(ctx, Token.ToString(), TokenName, TokenIsQuoted);
							 | 
						|||
| 
								 | 
							
														TokenIsQuoted = false;
							 | 
						|||
| 
								 | 
							
													}
							 | 
						|||
| 
								 | 
							
													TokenName = "";
							 | 
						|||
| 
								 | 
							
													Token.Length = 0;
							 | 
						|||
| 
								 | 
							
													if (stack.Count > 0)
							 | 
						|||
| 
								 | 
							
														ctx = stack.Peek();
							 | 
						|||
| 
								 | 
							
													break;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
												case ':':
							 | 
						|||
| 
								 | 
							
													if (QuoteMode)
							 | 
						|||
| 
								 | 
							
													{
							 | 
						|||
| 
								 | 
							
														Token.Append(aJSON[i]);
							 | 
						|||
| 
								 | 
							
														break;
							 | 
						|||
| 
								 | 
							
													}
							 | 
						|||
| 
								 | 
							
													TokenName = Token.ToString().Trim();
							 | 
						|||
| 
								 | 
							
													Token.Length = 0;
							 | 
						|||
| 
								 | 
							
													TokenIsQuoted = false;
							 | 
						|||
| 
								 | 
							
													break;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
												case '"':
							 | 
						|||
| 
								 | 
							
													QuoteMode ^= true;
							 | 
						|||
| 
								 | 
							
													TokenIsQuoted |= QuoteMode;
							 | 
						|||
| 
								 | 
							
													break;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
												case ',':
							 | 
						|||
| 
								 | 
							
													if (QuoteMode)
							 | 
						|||
| 
								 | 
							
													{
							 | 
						|||
| 
								 | 
							
														Token.Append(aJSON[i]);
							 | 
						|||
| 
								 | 
							
														break;
							 | 
						|||
| 
								 | 
							
													}
							 | 
						|||
| 
								 | 
							
													if (Token.Length > 0)
							 | 
						|||
| 
								 | 
							
													{
							 | 
						|||
| 
								 | 
							
														ParseElement(ctx, Token.ToString(), TokenName, TokenIsQuoted);
							 | 
						|||
| 
								 | 
							
														TokenIsQuoted = false;
							 | 
						|||
| 
								 | 
							
													}
							 | 
						|||
| 
								 | 
							
													TokenName = "";
							 | 
						|||
| 
								 | 
							
													Token.Length = 0;
							 | 
						|||
| 
								 | 
							
													TokenIsQuoted = false;
							 | 
						|||
| 
								 | 
							
													break;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
												case '\r':
							 | 
						|||
| 
								 | 
							
												case '\n':
							 | 
						|||
| 
								 | 
							
													break;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
												case ' ':
							 | 
						|||
| 
								 | 
							
												case '\t':
							 | 
						|||
| 
								 | 
							
													if (QuoteMode)
							 | 
						|||
| 
								 | 
							
														Token.Append(aJSON[i]);
							 | 
						|||
| 
								 | 
							
													break;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
												case '\\':
							 | 
						|||
| 
								 | 
							
													++i;
							 | 
						|||
| 
								 | 
							
													if (QuoteMode)
							 | 
						|||
| 
								 | 
							
													{
							 | 
						|||
| 
								 | 
							
														char C = aJSON[i];
							 | 
						|||
| 
								 | 
							
														switch (C)
							 | 
						|||
| 
								 | 
							
														{
							 | 
						|||
| 
								 | 
							
														case 't':
							 | 
						|||
| 
								 | 
							
															Token.Append('\t');
							 | 
						|||
| 
								 | 
							
															break;
							 | 
						|||
| 
								 | 
							
														case 'r':
							 | 
						|||
| 
								 | 
							
															Token.Append('\r');
							 | 
						|||
| 
								 | 
							
															break;
							 | 
						|||
| 
								 | 
							
														case 'n':
							 | 
						|||
| 
								 | 
							
															Token.Append('\n');
							 | 
						|||
| 
								 | 
							
															break;
							 | 
						|||
| 
								 | 
							
														case 'b':
							 | 
						|||
| 
								 | 
							
															Token.Append('\b');
							 | 
						|||
| 
								 | 
							
															break;
							 | 
						|||
| 
								 | 
							
														case 'f':
							 | 
						|||
| 
								 | 
							
															Token.Append('\f');
							 | 
						|||
| 
								 | 
							
															break;
							 | 
						|||
| 
								 | 
							
														case 'u':
							 | 
						|||
| 
								 | 
							
															{
							 | 
						|||
| 
								 | 
							
																string s = aJSON.Substring(i + 1, 4);
							 | 
						|||
| 
								 | 
							
																Token.Append((char)int.Parse(
							 | 
						|||
| 
								 | 
							
																	s,
							 | 
						|||
| 
								 | 
							
																	System.Globalization.NumberStyles.AllowHexSpecifier));
							 | 
						|||
| 
								 | 
							
																i += 4;
							 | 
						|||
| 
								 | 
							
																break;
							 | 
						|||
| 
								 | 
							
															}
							 | 
						|||
| 
								 | 
							
														default:
							 | 
						|||
| 
								 | 
							
															Token.Append(C);
							 | 
						|||
| 
								 | 
							
															break;
							 | 
						|||
| 
								 | 
							
														}
							 | 
						|||
| 
								 | 
							
													}
							 | 
						|||
| 
								 | 
							
													break;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
												default:
							 | 
						|||
| 
								 | 
							
													Token.Append(aJSON[i]);
							 | 
						|||
| 
								 | 
							
													break;
							 | 
						|||
| 
								 | 
							
												}
							 | 
						|||
| 
								 | 
							
												++i;
							 | 
						|||
| 
								 | 
							
											}
							 | 
						|||
| 
								 | 
							
											if (QuoteMode)
							 | 
						|||
| 
								 | 
							
											{
							 | 
						|||
| 
								 | 
							
												throw new Exception("JSON Parse: Quotation marks seems to be messed up.");
							 | 
						|||
| 
								 | 
							
											}
							 | 
						|||
| 
								 | 
							
											return ctx;
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public virtual void Serialize(System.IO.BinaryWriter aWriter)
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public void SaveToStream(System.IO.Stream aData)
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											var W = new System.IO.BinaryWriter(aData);
							 | 
						|||
| 
								 | 
							
											Serialize(W);
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										#if USE_SharpZipLib
							 | 
						|||
| 
								 | 
							
										public void SaveToCompressedStream(System.IO.Stream aData)
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
										using (var gzipOut = new ICSharpCode.SharpZipLib.BZip2.BZip2OutputStream(aData))
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
										gzipOut.IsStreamOwner = false;
							 | 
						|||
| 
								 | 
							
										SaveToStream(gzipOut);
							 | 
						|||
| 
								 | 
							
										gzipOut.Close();
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public void SaveToCompressedFile(string aFileName)
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										#if USE_FileIO
							 | 
						|||
| 
								 | 
							
										System.IO.Directory.CreateDirectory((new System.IO.FileInfo(aFileName)).Directory.FullName);
							 | 
						|||
| 
								 | 
							
										using(var F = System.IO.File.OpenWrite(aFileName))
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
										SaveToCompressedStream(F);
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										#else
							 | 
						|||
| 
								 | 
							
										throw new Exception("Can't use File IO stuff in the webplayer");
							 | 
						|||
| 
								 | 
							
										#endif
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
										public string SaveToCompressedBase64()
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
										using (var stream = new System.IO.MemoryStream())
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
										SaveToCompressedStream(stream);
							 | 
						|||
| 
								 | 
							
										stream.Position = 0;
							 | 
						|||
| 
								 | 
							
										return System.Convert.ToBase64String(stream.ToArray());
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										#else
							 | 
						|||
| 
								 | 
							
										public void SaveToCompressedStream(System.IO.Stream aData)
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											throw new Exception("Can't use compressed functions. You need include the SharpZipLib and uncomment the define at the top of SimpleJSON");
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public void SaveToCompressedFile(string aFileName)
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											throw new Exception("Can't use compressed functions. You need include the SharpZipLib and uncomment the define at the top of SimpleJSON");
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public string SaveToCompressedBase64()
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											throw new Exception("Can't use compressed functions. You need include the SharpZipLib and uncomment the define at the top of SimpleJSON");
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
										#endif
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public void SaveToFile(string aFileName)
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											#if USE_FileIO
							 | 
						|||
| 
								 | 
							
											System.IO.Directory.CreateDirectory((new System.IO.FileInfo(aFileName)).Directory.FullName);
							 | 
						|||
| 
								 | 
							
											using (var F = System.IO.File.OpenWrite(aFileName))
							 | 
						|||
| 
								 | 
							
											{
							 | 
						|||
| 
								 | 
							
												SaveToStream(F);
							 | 
						|||
| 
								 | 
							
											}
							 | 
						|||
| 
								 | 
							
											#else
							 | 
						|||
| 
								 | 
							
											throw new Exception ("Can't use File IO stuff in the webplayer");
							 | 
						|||
| 
								 | 
							
											#endif
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public string SaveToBase64()
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											using (var stream = new System.IO.MemoryStream())
							 | 
						|||
| 
								 | 
							
											{
							 | 
						|||
| 
								 | 
							
												SaveToStream(stream);
							 | 
						|||
| 
								 | 
							
												stream.Position = 0;
							 | 
						|||
| 
								 | 
							
												return System.Convert.ToBase64String(stream.ToArray());
							 | 
						|||
| 
								 | 
							
											}
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public static JSONNode Deserialize(System.IO.BinaryReader aReader)
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											JSONNodeType type = (JSONNodeType)aReader.ReadByte();
							 | 
						|||
| 
								 | 
							
											switch (type)
							 | 
						|||
| 
								 | 
							
											{
							 | 
						|||
| 
								 | 
							
											case JSONNodeType.Array:
							 | 
						|||
| 
								 | 
							
												{
							 | 
						|||
| 
								 | 
							
													int count = aReader.ReadInt32();
							 | 
						|||
| 
								 | 
							
													JSONArray tmp = new JSONArray();
							 | 
						|||
| 
								 | 
							
													for (int i = 0; i < count; i++)
							 | 
						|||
| 
								 | 
							
														tmp.Add(Deserialize(aReader));
							 | 
						|||
| 
								 | 
							
													return tmp;
							 | 
						|||
| 
								 | 
							
												}
							 | 
						|||
| 
								 | 
							
											case JSONNodeType.Object:
							 | 
						|||
| 
								 | 
							
												{
							 | 
						|||
| 
								 | 
							
													int count = aReader.ReadInt32();
							 | 
						|||
| 
								 | 
							
													JSONObject tmp = new JSONObject();
							 | 
						|||
| 
								 | 
							
													for (int i = 0; i < count; i++)
							 | 
						|||
| 
								 | 
							
													{
							 | 
						|||
| 
								 | 
							
														string key = aReader.ReadString();
							 | 
						|||
| 
								 | 
							
														var val = Deserialize(aReader);
							 | 
						|||
| 
								 | 
							
														tmp.Add(key, val);
							 | 
						|||
| 
								 | 
							
													}
							 | 
						|||
| 
								 | 
							
													return tmp;
							 | 
						|||
| 
								 | 
							
												}
							 | 
						|||
| 
								 | 
							
											case JSONNodeType.String:
							 | 
						|||
| 
								 | 
							
												{
							 | 
						|||
| 
								 | 
							
													return new JSONString(aReader.ReadString());
							 | 
						|||
| 
								 | 
							
												}
							 | 
						|||
| 
								 | 
							
											case JSONNodeType.Number:
							 | 
						|||
| 
								 | 
							
												{
							 | 
						|||
| 
								 | 
							
													return new JSONNumber(aReader.ReadDouble());
							 | 
						|||
| 
								 | 
							
												}
							 | 
						|||
| 
								 | 
							
											case JSONNodeType.Boolean:
							 | 
						|||
| 
								 | 
							
												{
							 | 
						|||
| 
								 | 
							
													return new JSONBool(aReader.ReadBoolean());
							 | 
						|||
| 
								 | 
							
												}
							 | 
						|||
| 
								 | 
							
											case JSONNodeType.NullValue:
							 | 
						|||
| 
								 | 
							
												{
							 | 
						|||
| 
								 | 
							
													return new JSONNull();
							 | 
						|||
| 
								 | 
							
												}
							 | 
						|||
| 
								 | 
							
											default:
							 | 
						|||
| 
								 | 
							
												{
							 | 
						|||
| 
								 | 
							
													throw new Exception("Error deserializing JSON. Unknown tag: " + type);
							 | 
						|||
| 
								 | 
							
												}
							 | 
						|||
| 
								 | 
							
											}
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										#if USE_SharpZipLib
							 | 
						|||
| 
								 | 
							
										public static JSONNode LoadFromCompressedStream(System.IO.Stream aData)
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
										var zin = new ICSharpCode.SharpZipLib.BZip2.BZip2InputStream(aData);
							 | 
						|||
| 
								 | 
							
										return LoadFromStream(zin);
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
										public static JSONNode LoadFromCompressedFile(string aFileName)
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
										#if USE_FileIO
							 | 
						|||
| 
								 | 
							
										using(var F = System.IO.File.OpenRead(aFileName))
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
										return LoadFromCompressedStream(F);
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
										#else
							 | 
						|||
| 
								 | 
							
										throw new Exception("Can't use File IO stuff in the webplayer");
							 | 
						|||
| 
								 | 
							
										#endif
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
										public static JSONNode LoadFromCompressedBase64(string aBase64)
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
										var tmp = System.Convert.FromBase64String(aBase64);
							 | 
						|||
| 
								 | 
							
										var stream = new System.IO.MemoryStream(tmp);
							 | 
						|||
| 
								 | 
							
										stream.Position = 0;
							 | 
						|||
| 
								 | 
							
										return LoadFromCompressedStream(stream);
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
										#else
							 | 
						|||
| 
								 | 
							
										public static JSONNode LoadFromCompressedFile(string aFileName)
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											throw new Exception("Can't use compressed functions. You need include the SharpZipLib and uncomment the define at the top of SimpleJSON");
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public static JSONNode LoadFromCompressedStream(System.IO.Stream aData)
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											throw new Exception("Can't use compressed functions. You need include the SharpZipLib and uncomment the define at the top of SimpleJSON");
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public static JSONNode LoadFromCompressedBase64(string aBase64)
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											throw new Exception("Can't use compressed functions. You need include the SharpZipLib and uncomment the define at the top of SimpleJSON");
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
										#endif
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public static JSONNode LoadFromStream(System.IO.Stream aData)
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											using (var R = new System.IO.BinaryReader(aData))
							 | 
						|||
| 
								 | 
							
											{
							 | 
						|||
| 
								 | 
							
												return Deserialize(R);
							 | 
						|||
| 
								 | 
							
											}
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public static JSONNode LoadFromFile(string aFileName)
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											#if USE_FileIO
							 | 
						|||
| 
								 | 
							
											using (var F = System.IO.File.OpenRead(aFileName))
							 | 
						|||
| 
								 | 
							
											{
							 | 
						|||
| 
								 | 
							
												return LoadFromStream(F);
							 | 
						|||
| 
								 | 
							
											}
							 | 
						|||
| 
								 | 
							
											#else
							 | 
						|||
| 
								 | 
							
											throw new Exception ("Can't use File IO stuff in the webplayer");
							 | 
						|||
| 
								 | 
							
											#endif
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public static JSONNode LoadFromBase64(string aBase64)
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											var tmp = System.Convert.FromBase64String(aBase64);
							 | 
						|||
| 
								 | 
							
											var stream = new System.IO.MemoryStream(tmp);
							 | 
						|||
| 
								 | 
							
											stream.Position = 0;
							 | 
						|||
| 
								 | 
							
											return LoadFromStream(stream);
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
									}
							 | 
						|||
| 
								 | 
							
									// End of JSONNode
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
									public class JSONArray : JSONNode, IEnumerable
							 | 
						|||
| 
								 | 
							
									{
							 | 
						|||
| 
								 | 
							
										private List<JSONNode> m_List = new List<JSONNode>();
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public override JSONNodeType Tag { get { return JSONNodeType.Array; } }
							 | 
						|||
| 
								 | 
							
										public override bool IsArray { get { return true; } }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public override JSONNode this[int aIndex]
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											get
							 | 
						|||
| 
								 | 
							
											{
							 | 
						|||
| 
								 | 
							
												if (aIndex < 0 || aIndex >= m_List.Count)
							 | 
						|||
| 
								 | 
							
													return new JSONLazyCreator(this);
							 | 
						|||
| 
								 | 
							
												return m_List[aIndex];
							 | 
						|||
| 
								 | 
							
											}
							 | 
						|||
| 
								 | 
							
											set
							 | 
						|||
| 
								 | 
							
											{
							 | 
						|||
| 
								 | 
							
												if (value == null)
							 | 
						|||
| 
								 | 
							
													value = new JSONNull();
							 | 
						|||
| 
								 | 
							
												if (aIndex < 0 || aIndex >= m_List.Count)
							 | 
						|||
| 
								 | 
							
													m_List.Add(value);
							 | 
						|||
| 
								 | 
							
												else
							 | 
						|||
| 
								 | 
							
													m_List[aIndex] = value;
							 | 
						|||
| 
								 | 
							
											}
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public override JSONNode this[string aKey]
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											get { return new JSONLazyCreator(this); }
							 | 
						|||
| 
								 | 
							
											set
							 | 
						|||
| 
								 | 
							
											{
							 | 
						|||
| 
								 | 
							
												if (value == null)
							 | 
						|||
| 
								 | 
							
													value = new JSONNull();
							 | 
						|||
| 
								 | 
							
												m_List.Add(value);
							 | 
						|||
| 
								 | 
							
											}
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public override int Count
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											get { return m_List.Count; }
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public override void Add(string aKey, JSONNode aItem)
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											if (aItem == null)
							 | 
						|||
| 
								 | 
							
												aItem = new JSONNull();
							 | 
						|||
| 
								 | 
							
											m_List.Add(aItem);
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public override JSONNode Remove(int aIndex)
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											if (aIndex < 0 || aIndex >= m_List.Count)
							 | 
						|||
| 
								 | 
							
												return null;
							 | 
						|||
| 
								 | 
							
											JSONNode tmp = m_List[aIndex];
							 | 
						|||
| 
								 | 
							
											m_List.RemoveAt(aIndex);
							 | 
						|||
| 
								 | 
							
											return tmp;
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public override JSONNode Remove(JSONNode aNode)
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											m_List.Remove(aNode);
							 | 
						|||
| 
								 | 
							
											return aNode;
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public override IEnumerable<JSONNode> Children
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											get
							 | 
						|||
| 
								 | 
							
											{
							 | 
						|||
| 
								 | 
							
												foreach (JSONNode N in m_List)
							 | 
						|||
| 
								 | 
							
													yield return N;
							 | 
						|||
| 
								 | 
							
											}
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public IEnumerator GetEnumerator()
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											foreach (JSONNode N in m_List)
							 | 
						|||
| 
								 | 
							
												yield return N;
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public override string ToString()
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											string result = "[ ";
							 | 
						|||
| 
								 | 
							
											foreach (JSONNode N in m_List)
							 | 
						|||
| 
								 | 
							
											{
							 | 
						|||
| 
								 | 
							
												if (result.Length > 2)
							 | 
						|||
| 
								 | 
							
													result += ", ";
							 | 
						|||
| 
								 | 
							
												result += N.ToString();
							 | 
						|||
| 
								 | 
							
											}
							 | 
						|||
| 
								 | 
							
											result += " ]";
							 | 
						|||
| 
								 | 
							
											return result;
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										internal override string ToString(string aIndent, string aPrefix)
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											string result = "[ ";
							 | 
						|||
| 
								 | 
							
											foreach (JSONNode N in m_List)
							 | 
						|||
| 
								 | 
							
											{
							 | 
						|||
| 
								 | 
							
												if (result.Length > 3)
							 | 
						|||
| 
								 | 
							
													result += ", ";
							 | 
						|||
| 
								 | 
							
												result += "\n"+aPrefix + aIndent + N.ToString(aIndent, aPrefix + aIndent);
							 | 
						|||
| 
								 | 
							
											}
							 | 
						|||
| 
								 | 
							
											result += "\n" + aPrefix + "]";
							 | 
						|||
| 
								 | 
							
											return result;
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public override void Serialize(System.IO.BinaryWriter aWriter)
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											aWriter.Write((byte)JSONNodeType.Array);
							 | 
						|||
| 
								 | 
							
											aWriter.Write(m_List.Count);
							 | 
						|||
| 
								 | 
							
											for (int i = 0; i < m_List.Count; i++)
							 | 
						|||
| 
								 | 
							
											{
							 | 
						|||
| 
								 | 
							
												m_List[i].Serialize(aWriter);
							 | 
						|||
| 
								 | 
							
											}
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
									}
							 | 
						|||
| 
								 | 
							
									// End of JSONArray
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
									public class JSONObject : JSONNode, IEnumerable
							 | 
						|||
| 
								 | 
							
									{
							 | 
						|||
| 
								 | 
							
										private Dictionary<string, JSONNode> m_Dict = new Dictionary<string, JSONNode>();
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public override JSONNodeType Tag { get { return JSONNodeType.Object; } }
							 | 
						|||
| 
								 | 
							
										public override bool IsObject { get { return true; } }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public override JSONNode this[string aKey]
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											get
							 | 
						|||
| 
								 | 
							
											{
							 | 
						|||
| 
								 | 
							
												if (m_Dict.ContainsKey(aKey))
							 | 
						|||
| 
								 | 
							
													return m_Dict[aKey];
							 | 
						|||
| 
								 | 
							
												else
							 | 
						|||
| 
								 | 
							
													return new JSONLazyCreator(this, aKey);
							 | 
						|||
| 
								 | 
							
											}
							 | 
						|||
| 
								 | 
							
											set
							 | 
						|||
| 
								 | 
							
											{
							 | 
						|||
| 
								 | 
							
												if (value == null)
							 | 
						|||
| 
								 | 
							
													value = new JSONNull();
							 | 
						|||
| 
								 | 
							
												if (m_Dict.ContainsKey(aKey))
							 | 
						|||
| 
								 | 
							
													m_Dict[aKey] = value;
							 | 
						|||
| 
								 | 
							
												else
							 | 
						|||
| 
								 | 
							
													m_Dict.Add(aKey, value);
							 | 
						|||
| 
								 | 
							
											}
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public override JSONNode this[int aIndex]
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											get
							 | 
						|||
| 
								 | 
							
											{
							 | 
						|||
| 
								 | 
							
												if (aIndex < 0 || aIndex >= m_Dict.Count)
							 | 
						|||
| 
								 | 
							
													return null;
							 | 
						|||
| 
								 | 
							
												return m_Dict.ElementAt(aIndex).Value;
							 | 
						|||
| 
								 | 
							
											}
							 | 
						|||
| 
								 | 
							
											set
							 | 
						|||
| 
								 | 
							
											{
							 | 
						|||
| 
								 | 
							
												if (value == null)
							 | 
						|||
| 
								 | 
							
													value = new JSONNull();
							 | 
						|||
| 
								 | 
							
												if (aIndex < 0 || aIndex >= m_Dict.Count)
							 | 
						|||
| 
								 | 
							
													return;
							 | 
						|||
| 
								 | 
							
												string key = m_Dict.ElementAt(aIndex).Key;
							 | 
						|||
| 
								 | 
							
												m_Dict[key] = value;
							 | 
						|||
| 
								 | 
							
											}
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public override int Count
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											get { return m_Dict.Count; }
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public override void Add(string aKey, JSONNode aItem)
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											if (aItem == null)
							 | 
						|||
| 
								 | 
							
												aItem = new JSONNull();
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
											if (!string.IsNullOrEmpty(aKey))
							 | 
						|||
| 
								 | 
							
											{
							 | 
						|||
| 
								 | 
							
												if (m_Dict.ContainsKey(aKey))
							 | 
						|||
| 
								 | 
							
													m_Dict[aKey] = aItem;
							 | 
						|||
| 
								 | 
							
												else
							 | 
						|||
| 
								 | 
							
													m_Dict.Add(aKey, aItem);
							 | 
						|||
| 
								 | 
							
											}
							 | 
						|||
| 
								 | 
							
											else
							 | 
						|||
| 
								 | 
							
												m_Dict.Add(Guid.NewGuid().ToString(), aItem);
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public override JSONNode Remove(string aKey)
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											if (!m_Dict.ContainsKey(aKey))
							 | 
						|||
| 
								 | 
							
												return null;
							 | 
						|||
| 
								 | 
							
											JSONNode tmp = m_Dict[aKey];
							 | 
						|||
| 
								 | 
							
											m_Dict.Remove(aKey);
							 | 
						|||
| 
								 | 
							
											return tmp;
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public override JSONNode Remove(int aIndex)
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											if (aIndex < 0 || aIndex >= m_Dict.Count)
							 | 
						|||
| 
								 | 
							
												return null;
							 | 
						|||
| 
								 | 
							
											var item = m_Dict.ElementAt(aIndex);
							 | 
						|||
| 
								 | 
							
											m_Dict.Remove(item.Key);
							 | 
						|||
| 
								 | 
							
											return item.Value;
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public override JSONNode Remove(JSONNode aNode)
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											try
							 | 
						|||
| 
								 | 
							
											{
							 | 
						|||
| 
								 | 
							
												var item = m_Dict.Where(k => k.Value == aNode).First();
							 | 
						|||
| 
								 | 
							
												m_Dict.Remove(item.Key);
							 | 
						|||
| 
								 | 
							
												return aNode;
							 | 
						|||
| 
								 | 
							
											}
							 | 
						|||
| 
								 | 
							
											catch
							 | 
						|||
| 
								 | 
							
											{
							 | 
						|||
| 
								 | 
							
												return null;
							 | 
						|||
| 
								 | 
							
											}
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public override IEnumerable<JSONNode> Children
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											get
							 | 
						|||
| 
								 | 
							
											{
							 | 
						|||
| 
								 | 
							
												foreach (KeyValuePair<string, JSONNode> N in m_Dict)
							 | 
						|||
| 
								 | 
							
													yield return N.Value;
							 | 
						|||
| 
								 | 
							
											}
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public IEnumerator GetEnumerator()
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											foreach (KeyValuePair<string, JSONNode> N in m_Dict)
							 | 
						|||
| 
								 | 
							
												yield return N;
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public override string ToString()
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											string result = "{";
							 | 
						|||
| 
								 | 
							
											foreach (KeyValuePair<string, JSONNode> N in m_Dict)
							 | 
						|||
| 
								 | 
							
											{
							 | 
						|||
| 
								 | 
							
												if (result.Length > 2)
							 | 
						|||
| 
								 | 
							
													result += ", ";
							 | 
						|||
| 
								 | 
							
												result += "\"" + Escape(N.Key) + "\":" + N.Value.ToString();
							 | 
						|||
| 
								 | 
							
											}
							 | 
						|||
| 
								 | 
							
											result += "}";
							 | 
						|||
| 
								 | 
							
											return result;
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										internal override string ToString(string aIndent, string aPrefix)
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											string result = "{ ";
							 | 
						|||
| 
								 | 
							
											foreach (KeyValuePair<string, JSONNode> N in m_Dict)
							 | 
						|||
| 
								 | 
							
											{
							 | 
						|||
| 
								 | 
							
												if (result.Length > 3)
							 | 
						|||
| 
								 | 
							
													result += ", ";
							 | 
						|||
| 
								 | 
							
												result += "\n" + aPrefix + aIndent + "\"" + Escape(N.Key) + "\" : ";
							 | 
						|||
| 
								 | 
							
												result += N.Value.ToString(aIndent, aPrefix + aIndent);
							 | 
						|||
| 
								 | 
							
											}
							 | 
						|||
| 
								 | 
							
											result += "\n" + aPrefix + "}";
							 | 
						|||
| 
								 | 
							
											return result;
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public override void Serialize(System.IO.BinaryWriter aWriter)
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											aWriter.Write((byte)JSONNodeType.Object);
							 | 
						|||
| 
								 | 
							
											aWriter.Write(m_Dict.Count);
							 | 
						|||
| 
								 | 
							
											foreach (string K in m_Dict.Keys)
							 | 
						|||
| 
								 | 
							
											{
							 | 
						|||
| 
								 | 
							
												aWriter.Write(K);
							 | 
						|||
| 
								 | 
							
												m_Dict[K].Serialize(aWriter);
							 | 
						|||
| 
								 | 
							
											}
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
									}
							 | 
						|||
| 
								 | 
							
									// End of JSONObject
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
									public class JSONString : JSONNode
							 | 
						|||
| 
								 | 
							
									{
							 | 
						|||
| 
								 | 
							
										private string m_Data;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public override JSONNodeType Tag { get { return JSONNodeType.String; } }
							 | 
						|||
| 
								 | 
							
										public override bool IsString { get { return true; } }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public override string Value
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											get { return m_Data; }
							 | 
						|||
| 
								 | 
							
											set
							 | 
						|||
| 
								 | 
							
											{
							 | 
						|||
| 
								 | 
							
												m_Data = value;
							 | 
						|||
| 
								 | 
							
											}
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public JSONString(string aData)
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											m_Data = aData;
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public override string ToString()
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											return "\"" + Escape(m_Data) + "\"";
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										internal override string ToString(string aIndent, string aPrefix)
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											return "\"" + Escape(m_Data) + "\"";
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public override void Serialize(System.IO.BinaryWriter aWriter)
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											aWriter.Write((byte)JSONNodeType.String);
							 | 
						|||
| 
								 | 
							
											aWriter.Write(m_Data);
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
									}
							 | 
						|||
| 
								 | 
							
									// End of JSONString
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
									public class JSONNumber : JSONNode
							 | 
						|||
| 
								 | 
							
									{
							 | 
						|||
| 
								 | 
							
										private double m_Data;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public override JSONNodeType Tag { get { return JSONNodeType.Number; } }
							 | 
						|||
| 
								 | 
							
										public override bool IsNumber { get { return true; } }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public override string Value
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											get { return m_Data.ToString(); }
							 | 
						|||
| 
								 | 
							
											set
							 | 
						|||
| 
								 | 
							
											{
							 | 
						|||
| 
								 | 
							
												double v;
							 | 
						|||
| 
								 | 
							
												if (double.TryParse(value, out v))
							 | 
						|||
| 
								 | 
							
													m_Data = v;
							 | 
						|||
| 
								 | 
							
											}
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public override double AsDouble
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											get { return m_Data; }
							 | 
						|||
| 
								 | 
							
											set { m_Data = value; }
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public JSONNumber(double aData)
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											m_Data = aData;
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public JSONNumber(string aData)
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											Value = aData;
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public override string ToString()
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											return m_Data.ToString();
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										internal override string ToString(string aIndent, string aPrefix)
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											return m_Data.ToString();
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public override void Serialize(System.IO.BinaryWriter aWriter)
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											aWriter.Write((byte)JSONNodeType.Number);
							 | 
						|||
| 
								 | 
							
											aWriter.Write(m_Data);
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
									}
							 | 
						|||
| 
								 | 
							
									// End of JSONNumber
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
									public class JSONBool : JSONNode
							 | 
						|||
| 
								 | 
							
									{
							 | 
						|||
| 
								 | 
							
										private bool m_Data;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public override JSONNodeType Tag { get { return JSONNodeType.Boolean; } }
							 | 
						|||
| 
								 | 
							
										public override bool IsBoolean { get { return true; } }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public override string Value
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											get { return m_Data.ToString(); }
							 | 
						|||
| 
								 | 
							
											set
							 | 
						|||
| 
								 | 
							
											{
							 | 
						|||
| 
								 | 
							
												bool v;
							 | 
						|||
| 
								 | 
							
												if (bool.TryParse(value, out v))
							 | 
						|||
| 
								 | 
							
													m_Data = v;
							 | 
						|||
| 
								 | 
							
											}
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
										public override bool AsBool
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											get { return m_Data; }
							 | 
						|||
| 
								 | 
							
											set { m_Data = value; }
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public JSONBool(bool aData)
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											m_Data = aData;
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public JSONBool(string aData)
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											Value = aData;
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public override string ToString()
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											return (m_Data) ? "true" : "false";
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										internal override string ToString(string aIndent, string aPrefix)
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											return (m_Data) ? "true" : "false";
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public override void Serialize(System.IO.BinaryWriter aWriter)
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											aWriter.Write((byte)JSONNodeType.Boolean);
							 | 
						|||
| 
								 | 
							
											aWriter.Write(m_Data);
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
									}
							 | 
						|||
| 
								 | 
							
									// End of JSONBool
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
									public class JSONNull : JSONNode
							 | 
						|||
| 
								 | 
							
									{
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public override JSONNodeType Tag { get { return JSONNodeType.NullValue; } }
							 | 
						|||
| 
								 | 
							
										public override bool IsNull { get { return true; } }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public override string Value
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											get { return "null"; }
							 | 
						|||
| 
								 | 
							
											set { }
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
										public override bool AsBool
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											get { return false; }
							 | 
						|||
| 
								 | 
							
											set { }
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public override string ToString()
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											return "null";
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										internal override string ToString(string aIndent, string aPrefix)
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											return "null";
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public override bool Equals(object obj)
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											if (object.ReferenceEquals(this, obj))
							 | 
						|||
| 
								 | 
							
												return true;
							 | 
						|||
| 
								 | 
							
											return (obj is JSONNull);
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
										public override int GetHashCode()
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											return base.GetHashCode();
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public override void Serialize(System.IO.BinaryWriter aWriter)
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											aWriter.Write((byte)JSONNodeType.NullValue);
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
									}
							 | 
						|||
| 
								 | 
							
									// End of JSONNull
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
									internal class JSONLazyCreator : JSONNode
							 | 
						|||
| 
								 | 
							
									{
							 | 
						|||
| 
								 | 
							
										private JSONNode m_Node = null;
							 | 
						|||
| 
								 | 
							
										private string m_Key = null;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public override JSONNodeType Tag { get { return JSONNodeType.None; } }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public JSONLazyCreator(JSONNode aNode)
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											m_Node = aNode;
							 | 
						|||
| 
								 | 
							
											m_Key = null;
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public JSONLazyCreator(JSONNode aNode, string aKey)
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											m_Node = aNode;
							 | 
						|||
| 
								 | 
							
											m_Key = aKey;
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										private void Set(JSONNode aVal)
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											if (m_Key == null)
							 | 
						|||
| 
								 | 
							
											{
							 | 
						|||
| 
								 | 
							
												m_Node.Add(aVal);
							 | 
						|||
| 
								 | 
							
											}
							 | 
						|||
| 
								 | 
							
											else
							 | 
						|||
| 
								 | 
							
											{
							 | 
						|||
| 
								 | 
							
												m_Node.Add(m_Key, aVal);
							 | 
						|||
| 
								 | 
							
											}
							 | 
						|||
| 
								 | 
							
											m_Node = null; // Be GC friendly.
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public override JSONNode this[int aIndex]
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											get
							 | 
						|||
| 
								 | 
							
											{
							 | 
						|||
| 
								 | 
							
												return new JSONLazyCreator(this);
							 | 
						|||
| 
								 | 
							
											}
							 | 
						|||
| 
								 | 
							
											set
							 | 
						|||
| 
								 | 
							
											{
							 | 
						|||
| 
								 | 
							
												var tmp = new JSONArray();
							 | 
						|||
| 
								 | 
							
												tmp.Add(value);
							 | 
						|||
| 
								 | 
							
												Set(tmp);
							 | 
						|||
| 
								 | 
							
											}
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public override JSONNode this[string aKey]
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											get
							 | 
						|||
| 
								 | 
							
											{
							 | 
						|||
| 
								 | 
							
												return new JSONLazyCreator(this, aKey);
							 | 
						|||
| 
								 | 
							
											}
							 | 
						|||
| 
								 | 
							
											set
							 | 
						|||
| 
								 | 
							
											{
							 | 
						|||
| 
								 | 
							
												var tmp = new JSONObject();
							 | 
						|||
| 
								 | 
							
												tmp.Add(aKey, value);
							 | 
						|||
| 
								 | 
							
												Set(tmp);
							 | 
						|||
| 
								 | 
							
											}
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public override void Add(JSONNode aItem)
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											var tmp = new JSONArray();
							 | 
						|||
| 
								 | 
							
											tmp.Add(aItem);
							 | 
						|||
| 
								 | 
							
											Set(tmp);
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public override void Add(string aKey, JSONNode aItem)
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											var tmp = new JSONObject();
							 | 
						|||
| 
								 | 
							
											tmp.Add(aKey, aItem);
							 | 
						|||
| 
								 | 
							
											Set(tmp);
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public static bool operator ==(JSONLazyCreator a, object b)
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											if (b == null)
							 | 
						|||
| 
								 | 
							
												return true;
							 | 
						|||
| 
								 | 
							
											return System.Object.ReferenceEquals(a, b);
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public static bool operator !=(JSONLazyCreator a, object b)
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											return !(a == b);
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public override bool Equals(object obj)
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											if (obj == null)
							 | 
						|||
| 
								 | 
							
												return true;
							 | 
						|||
| 
								 | 
							
											return System.Object.ReferenceEquals(this, obj);
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public override int GetHashCode()
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											return base.GetHashCode();
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public override string ToString()
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											return "";
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										internal override string ToString(string aIndent, string aPrefix)
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											return "";
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public override int AsInt
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											get
							 | 
						|||
| 
								 | 
							
											{
							 | 
						|||
| 
								 | 
							
												JSONNumber tmp = new JSONNumber(0);
							 | 
						|||
| 
								 | 
							
												Set(tmp);
							 | 
						|||
| 
								 | 
							
												return 0;
							 | 
						|||
| 
								 | 
							
											}
							 | 
						|||
| 
								 | 
							
											set
							 | 
						|||
| 
								 | 
							
											{
							 | 
						|||
| 
								 | 
							
												JSONNumber tmp = new JSONNumber(value);
							 | 
						|||
| 
								 | 
							
												Set(tmp);
							 | 
						|||
| 
								 | 
							
											}
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public override float AsFloat
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											get
							 | 
						|||
| 
								 | 
							
											{
							 | 
						|||
| 
								 | 
							
												JSONNumber tmp = new JSONNumber(0.0f);
							 | 
						|||
| 
								 | 
							
												Set(tmp);
							 | 
						|||
| 
								 | 
							
												return 0.0f;
							 | 
						|||
| 
								 | 
							
											}
							 | 
						|||
| 
								 | 
							
											set
							 | 
						|||
| 
								 | 
							
											{
							 | 
						|||
| 
								 | 
							
												JSONNumber tmp = new JSONNumber(value);
							 | 
						|||
| 
								 | 
							
												Set(tmp);
							 | 
						|||
| 
								 | 
							
											}
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public override double AsDouble
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											get
							 | 
						|||
| 
								 | 
							
											{
							 | 
						|||
| 
								 | 
							
												JSONNumber tmp = new JSONNumber(0.0);
							 | 
						|||
| 
								 | 
							
												Set(tmp);
							 | 
						|||
| 
								 | 
							
												return 0.0;
							 | 
						|||
| 
								 | 
							
											}
							 | 
						|||
| 
								 | 
							
											set
							 | 
						|||
| 
								 | 
							
											{
							 | 
						|||
| 
								 | 
							
												JSONNumber tmp = new JSONNumber(value);
							 | 
						|||
| 
								 | 
							
												Set(tmp);
							 | 
						|||
| 
								 | 
							
											}
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public override bool AsBool
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											get
							 | 
						|||
| 
								 | 
							
											{
							 | 
						|||
| 
								 | 
							
												JSONBool tmp = new JSONBool(false);
							 | 
						|||
| 
								 | 
							
												Set(tmp);
							 | 
						|||
| 
								 | 
							
												return false;
							 | 
						|||
| 
								 | 
							
											}
							 | 
						|||
| 
								 | 
							
											set
							 | 
						|||
| 
								 | 
							
											{
							 | 
						|||
| 
								 | 
							
												JSONBool tmp = new JSONBool(value);
							 | 
						|||
| 
								 | 
							
												Set(tmp);
							 | 
						|||
| 
								 | 
							
											}
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public override JSONArray AsArray
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											get
							 | 
						|||
| 
								 | 
							
											{
							 | 
						|||
| 
								 | 
							
												JSONArray tmp = new JSONArray();
							 | 
						|||
| 
								 | 
							
												Set(tmp);
							 | 
						|||
| 
								 | 
							
												return tmp;
							 | 
						|||
| 
								 | 
							
											}
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public override JSONObject AsObject
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											get
							 | 
						|||
| 
								 | 
							
											{
							 | 
						|||
| 
								 | 
							
												JSONObject tmp = new JSONObject();
							 | 
						|||
| 
								 | 
							
												Set(tmp);
							 | 
						|||
| 
								 | 
							
												return tmp;
							 | 
						|||
| 
								 | 
							
											}
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
									}
							 | 
						|||
| 
								 | 
							
									// End of JSONLazyCreator
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
									public static class JSON
							 | 
						|||
| 
								 | 
							
									{
							 | 
						|||
| 
								 | 
							
										public static JSONNode Parse(string aJSON)
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											return JSONNode.Parse(aJSON);
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
									}
							 | 
						|||
| 
								 | 
							
								}
							 |