| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021 |
- //#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 ignores data types. Each value is a string.
- * - only double quotes (") are used for quoting strings.
- * - values and names are not restricted to quoted strings. They simply add up and are trimmed.
- * - There are only 3 types: arrays(JSONArray), objects(JSONClass) and values(JSONData)
- * - 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 try to avoid errors, but if malformed JSON is parsed the result is undefined
- *
- *
- * 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.
- *
- * * * * */
- using System;
- using System.Collections;
- using System.Collections.Generic;
- using System.Linq;
- namespace quicksdk
- {
- namespace SimpleJSON
- {
- public enum JSONBinaryTag
- {
- Array = 1,
- Class = 2,
- Value = 3,
- IntValue = 4,
- DoubleValue = 5,
- BoolValue = 6,
- FloatValue = 7,
- }
-
- public class JSONNode
- {
- #region common interface
- public virtual void Add (string aKey, JSONNode aItem)
- {
- }
- 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 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> Childs { get { yield break; } }
- public IEnumerable<JSONNode> DeepChilds {
- get {
- foreach (var C in Childs)
- foreach (var D in C.DeepChilds)
- yield return D;
- }
- }
-
- public override string ToString ()
- {
- return "JSONNode";
- }
- public virtual string ToString (string aPrefix)
- {
- return "JSONNode";
- }
-
- #endregion common interface
-
- #region typecasting properties
- public virtual int AsInt {
- get {
- int v = 0;
- if (int.TryParse (Value, out v))
- return v;
- return 0;
- }
- set {
- Value = value.ToString ();
- }
- }
- public virtual float AsFloat {
- get {
- float v = 0.0f;
- if (float.TryParse (Value, out v))
- return v;
- return 0.0f;
- }
- set {
- Value = value.ToString ();
- }
- }
- 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 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 JSONClass AsObject {
- get {
- return this as JSONClass;
- }
- }
-
-
- #endregion typecasting properties
-
- #region operators
- public static implicit operator JSONNode (string s)
- {
- return new JSONData (s);
- }
- public static implicit operator string (JSONNode d)
- {
- return (d == null) ? null : d.Value;
- }
- public static bool operator == (JSONNode a, object b)
- {
- if (b == null && a is JSONLazyCreator)
- return true;
- return System.Object.ReferenceEquals (a, b);
- }
-
- 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 string Escape (string aText)
- {
- string result = "";
- foreach (char c in aText) {
- switch (c) {
- case '\\':
- result += "\\\\";
- break;
- case '\"':
- result += "\\\"";
- break;
- case '\n':
- result += "\\n";
- break;
- case '\r':
- result += "\\r";
- break;
- case '\t':
- result += "\\t";
- break;
- case '\b':
- result += "\\b";
- break;
- case '\f':
- result += "\\f";
- break;
- default :
- result += c;
- break;
- }
- }
- return result;
- }
-
- public static JSONNode Parse (string aJSON)
- {
- Stack<JSONNode> stack = new Stack<JSONNode> ();
- JSONNode ctx = null;
- int i = 0;
- string Token = "";
- string TokenName = "";
- bool QuoteMode = false;
- while (i < aJSON.Length) {
- switch (aJSON [i]) {
- case '{':
- if (QuoteMode) {
- Token += aJSON [i];
- break;
- }
- stack.Push (new JSONClass ());
- if (ctx != null) {
- TokenName = TokenName.Trim ();
- if (ctx is JSONArray)
- ctx.Add (stack.Peek ());
- else if (TokenName != "")
- ctx.Add (TokenName, stack.Peek ());
- }
- TokenName = "";
- Token = "";
- ctx = stack.Peek ();
- break;
-
- case '[':
- if (QuoteMode) {
- Token += aJSON [i];
- break;
- }
-
- stack.Push (new JSONArray ());
- if (ctx != null) {
- TokenName = TokenName.Trim ();
- if (ctx is JSONArray)
- ctx.Add (stack.Peek ());
- else if (TokenName != "")
- ctx.Add (TokenName, stack.Peek ());
- }
- TokenName = "";
- Token = "";
- ctx = stack.Peek ();
- break;
-
- case '}':
- case ']':
- if (QuoteMode) {
- Token += aJSON [i];
- break;
- }
- if (stack.Count == 0)
- throw new Exception ("JSON Parse: Too many closing brackets");
-
- stack.Pop ();
- if (Token != "") {
- TokenName = TokenName.Trim ();
- if (ctx is JSONArray)
- ctx.Add (Token);
- else if (TokenName != "")
- ctx.Add (TokenName, Token);
- }
- TokenName = "";
- Token = "";
- if (stack.Count > 0)
- ctx = stack.Peek ();
- break;
-
- case ':':
- if (QuoteMode) {
- Token += aJSON [i];
- break;
- }
- TokenName = Token;
- Token = "";
- break;
-
- case '"':
- QuoteMode ^= true;
- break;
-
- case ',':
- if (QuoteMode) {
- Token += aJSON [i];
- break;
- }
- if (Token != "") {
- if (ctx is JSONArray)
- ctx.Add (Token);
- else if (TokenName != "")
- ctx.Add (TokenName, Token);
- }
- TokenName = "";
- Token = "";
- break;
-
- case '\r':
- case '\n':
- break;
-
- case ' ':
- case '\t':
- if (QuoteMode)
- Token += aJSON [i];
- break;
-
- case '\\':
- ++i;
- if (QuoteMode) {
- char C = aJSON [i];
- switch (C) {
- case 't':
- Token += '\t';
- break;
- case 'r':
- Token += '\r';
- break;
- case 'n':
- Token += '\n';
- break;
- case 'b':
- Token += '\b';
- break;
- case 'f':
- Token += '\f';
- break;
- case 'u':
- {
- string s = aJSON.Substring (i + 1, 4);
- Token += (char)int.Parse (s, System.Globalization.NumberStyles.AllowHexSpecifier);
- i += 4;
- break;
- }
- default :
- Token += C;
- break;
- }
- }
- break;
-
- default:
- Token += 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 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 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)
- {
- JSONBinaryTag type = (JSONBinaryTag)aReader.ReadByte ();
- switch (type) {
- case JSONBinaryTag.Array:
- {
- int count = aReader.ReadInt32 ();
- JSONArray tmp = new JSONArray ();
- for (int i = 0; i < count; i++)
- tmp.Add (Deserialize (aReader));
- return tmp;
- }
- case JSONBinaryTag.Class:
- {
- int count = aReader.ReadInt32 ();
- JSONClass tmp = new JSONClass ();
- for (int i = 0; i < count; i++) {
- string key = aReader.ReadString ();
- var val = Deserialize (aReader);
- tmp.Add (key, val);
- }
- return tmp;
- }
- case JSONBinaryTag.Value:
- {
- return new JSONData (aReader.ReadString ());
- }
- case JSONBinaryTag.IntValue:
- {
- return new JSONData (aReader.ReadInt32 ());
- }
- case JSONBinaryTag.DoubleValue:
- {
- return new JSONData (aReader.ReadDouble ());
- }
- case JSONBinaryTag.BoolValue:
- {
- return new JSONData (aReader.ReadBoolean ());
- }
- case JSONBinaryTag.FloatValue:
- {
- return new JSONData (aReader.ReadSingle ());
- }
-
- 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 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 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 JSONNode this [int aIndex] {
- get {
- if (aIndex < 0 || aIndex >= m_List.Count)
- return new JSONLazyCreator (this);
- return m_List [aIndex];
- }
- set {
- 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{ m_List.Add (value); }
- }
- public override int Count {
- get { return m_List.Count; }
- }
- public override void Add (string aKey, JSONNode aItem)
- {
- 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> Childs {
- 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;
- }
- public override string ToString (string aPrefix)
- {
- string result = "[ ";
- foreach (JSONNode N in m_List) {
- if (result.Length > 3)
- result += ", ";
- result += "\n" + aPrefix + " ";
- result += N.ToString (aPrefix + " ");
- }
- result += "\n" + aPrefix + "]";
- return result;
- }
- public override void Serialize (System.IO.BinaryWriter aWriter)
- {
- aWriter.Write ((byte)JSONBinaryTag.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 JSONClass : JSONNode, IEnumerable
- {
- private Dictionary<string,JSONNode> m_Dict = new Dictionary<string,JSONNode> ();
- public override JSONNode this [string aKey] {
- get {
- if (m_Dict.ContainsKey (aKey))
- return m_Dict [aKey];
- else
- return new JSONLazyCreator (this, aKey);
- }
- set {
- 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 (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 (!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> Childs {
- 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;
- }
- public override string ToString (string aPrefix)
- {
- string result = "{ ";
- foreach (KeyValuePair<string, JSONNode> N in m_Dict) {
- if (result.Length > 3)
- result += ", ";
- result += "\n" + aPrefix + " ";
- result += "\"" + Escape (N.Key) + "\" : " + N.Value.ToString (aPrefix + " ");
- }
- result += "\n" + aPrefix + "}";
- return result;
- }
- public override void Serialize (System.IO.BinaryWriter aWriter)
- {
- aWriter.Write ((byte)JSONBinaryTag.Class);
- aWriter.Write (m_Dict.Count);
- foreach (string K in m_Dict.Keys) {
- aWriter.Write (K);
- m_Dict [K].Serialize (aWriter);
- }
- }
- } // End of JSONClass
-
- public class JSONData : JSONNode
- {
- private string m_Data;
- public override string Value {
- get { return m_Data; }
- set { m_Data = value; }
- }
- public JSONData (string aData)
- {
- m_Data = aData;
- }
- public JSONData (float aData)
- {
- AsFloat = aData;
- }
- public JSONData (double aData)
- {
- AsDouble = aData;
- }
- public JSONData (bool aData)
- {
- AsBool = aData;
- }
- public JSONData (int aData)
- {
- AsInt = aData;
- }
-
- public override string ToString ()
- {
- return "\"" + Escape (m_Data) + "\"";
- }
- public override string ToString (string aPrefix)
- {
- return "\"" + Escape (m_Data) + "\"";
- }
- public override void Serialize (System.IO.BinaryWriter aWriter)
- {
- var tmp = new JSONData ("");
-
- tmp.AsInt = AsInt;
- if (tmp.m_Data == this.m_Data) {
- aWriter.Write ((byte)JSONBinaryTag.IntValue);
- aWriter.Write (AsInt);
- return;
- }
- tmp.AsFloat = AsFloat;
- if (tmp.m_Data == this.m_Data) {
- aWriter.Write ((byte)JSONBinaryTag.FloatValue);
- aWriter.Write (AsFloat);
- return;
- }
- tmp.AsDouble = AsDouble;
- if (tmp.m_Data == this.m_Data) {
- aWriter.Write ((byte)JSONBinaryTag.DoubleValue);
- aWriter.Write (AsDouble);
- return;
- }
-
- tmp.AsBool = AsBool;
- if (tmp.m_Data == this.m_Data) {
- aWriter.Write ((byte)JSONBinaryTag.BoolValue);
- aWriter.Write (AsBool);
- return;
- }
- aWriter.Write ((byte)JSONBinaryTag.Value);
- aWriter.Write (m_Data);
- }
- } // End of JSONData
-
- internal class JSONLazyCreator : JSONNode
- {
- private JSONNode m_Node = null;
- private string m_Key = null;
-
- 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 JSONClass ();
- 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 JSONClass ();
- 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 "";
- }
- public override string ToString (string aPrefix)
- {
- return "";
- }
-
- public override int AsInt {
- get {
- JSONData tmp = new JSONData (0);
- Set (tmp);
- return 0;
- }
- set {
- JSONData tmp = new JSONData (value);
- Set (tmp);
- }
- }
- public override float AsFloat {
- get {
- JSONData tmp = new JSONData (0.0f);
- Set (tmp);
- return 0.0f;
- }
- set {
- JSONData tmp = new JSONData (value);
- Set (tmp);
- }
- }
- public override double AsDouble {
- get {
- JSONData tmp = new JSONData (0.0);
- Set (tmp);
- return 0.0;
- }
- set {
- JSONData tmp = new JSONData (value);
- Set (tmp);
- }
- }
- public override bool AsBool {
- get {
- JSONData tmp = new JSONData (false);
- Set (tmp);
- return false;
- }
- set {
- JSONData tmp = new JSONData (value);
- Set (tmp);
- }
- }
- public override JSONArray AsArray {
- get {
- JSONArray tmp = new JSONArray ();
- Set (tmp);
- return tmp;
- }
- }
- public override JSONClass AsObject {
- get {
- JSONClass tmp = new JSONClass ();
- Set (tmp);
- return tmp;
- }
- }
- } // End of JSONLazyCreator
-
- public static class JSON
- {
- public static JSONNode Parse (string aJSON)
- {
- return JSONNode.Parse (aJSON);
- }
- }
- }
- }
|