Best Vstest code snippet using SimpleJSON.LinqEnumerator.ToString
SimpleJSON.cs
Source:SimpleJSON.cs  
...44 *   parsing now happens at parsing time and not when you actually access one of the casting properties.45 * 46 * [2017-04-11 Update]47 * - Fixed parsing bug where empty string values have been ignored.48 * - Optimised "ToString" by using a StringBuilder internally. This should heavily improve performance for large files49 * - Changed the overload of "ToString(string aIndent)" to "ToString(int aIndent)"50 * 51 * [2017-11-29 Update]52 * - Removed the IEnumerator implementations on JSONArray & JSONObject and replaced it with a common53 *   struct Enumerator in JSONNode that should avoid garbage generation. The enumerator always works54 *   on KeyValuePair<string, JSONNode>, even for JSONArray.55 * - Added two wrapper Enumerators that allows for easy key or value enumeration. A JSONNode now has56 *   a "Keys" and a "Values" enumerable property. Those are also struct enumerators / enumerables57 * - A KeyValuePair<string, JSONNode> can now be implicitly converted into a JSONNode. This allows58 *   a foreach loop over a JSONNode to directly access the values only. Since KeyValuePair as well as59 *   all the Enumerators are structs, no garbage is allocated.60 * - To add Linq support another "LinqEnumerator" is available through the "Linq" property. This61 *   enumerator does implement the generic IEnumerable interface so most Linq extensions can be used62 *   on this enumerable object. This one does allocate memory as it's a wrapper class.63 * - The Escape method now escapes all control characters (# < 32) in strings as uncode characters64 *   (\uXXXX) and if the static bool JSONNode.forceASCII is set to true it will also escape all65 *   characters # > 127. This might be useful if you require an ASCII output. Though keep in mind66 *   when your strings contain many non-ascii characters the strings become much longer (x6) and are67 *   no longer human readable.68 * - The node types JSONObject and JSONArray now have an "Inline" boolean switch which will default to69 *   false. It can be used to serialize this element inline even you serialize with an indented format70 *   This is useful for arrays containing numbers so it doesn't place every number on a new line71 * - Extracted the binary serialization code into a seperate extension file. All classes are now declared72 *   as "partial" so an extension file can even add a new virtual or abstract method / interface to73 *   JSONNode and override it in the concrete type classes. It's of course a hacky approach which is74 *   generally not recommended, but i wanted to keep everything tightly packed.75 * - Added a static CreateOrGet method to the JSONNull class. Since this class is immutable it could76 *   be reused without major problems. If you have a lot null fields in your data it will help reduce77 *   the memory / garbage overhead. I also added a static setting (reuseSameInstance) to JSONNull78 *   (default is true) which will change the behaviour of "CreateOrGet". If you set this to false79 *   CreateOrGet will not reuse the cached instance but instead create a new JSONNull instance each time.80 *   I made the JSONNull constructor private so if you need to create an instance manually use81 *   JSONNull.CreateOrGet()82 * 83 * [2018-01-09 Update]84 * - Changed all double.TryParse and double.ToString uses to use the invariant culture to avoid problems85 *   on systems with a culture that uses a comma as decimal point.86 * 87 * [2018-01-26 Update]88 * - Added AsLong. Note that a JSONNumber is stored as double and can't represent all long values. However89 *   storing it as string would work.90 * - Added static setting "JSONNode.longAsString" which controls the default type that is used by the91 *   LazyCreator when using AsLong92 * 93 * 94 * The MIT License (MIT)95 * 96 * Copyright (c) 2012-2017 Markus Göbel (Bunny83)97 * 98 * Permission is hereby granted, free of charge, to any person obtaining a copy99 * of this software and associated documentation files (the "Software"), to deal100 * in the Software without restriction, including without limitation the rights101 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell102 * copies of the Software, and to permit persons to whom the Software is103 * furnished to do so, subject to the following conditions:104 * 105 * The above copyright notice and this permission notice shall be included in all106 * copies or substantial portions of the Software.107 * 108 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR109 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,110 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE111 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER112 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,113 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE114 * SOFTWARE.115 * 116 * * * * */117using System;118using System.Collections;119using System.Collections.Generic;120using System.Globalization;121using System.Linq;122using System.Text;123namespace ThirdParty.SimpleJSON124{125    public enum JSONNodeType126    {127        Array = 1,128        Object = 2,129        String = 3,130        Number = 4,131        NullValue = 5,132        Boolean = 6,133        None = 7,134        Custom = 0xFF,135    }136    public enum JSONTextMode137    {138        Compact,139        Indent140    }141    public abstract partial class JSONNode142    {143        #region Enumerators144        public struct Enumerator145        {146            enum Type { None, Array, Object }147            Type type;148            Dictionary<string, global::ThirdParty.SimpleJSON.JSONNode>.Enumerator m_Object;149            List<global::ThirdParty.SimpleJSON.JSONNode>.Enumerator m_Array;150            public bool IsValid { get { return type != Type.None; } }151            public Enumerator(List<global::ThirdParty.SimpleJSON.JSONNode>.Enumerator aArrayEnum)152            {153                type = Type.Array;154                m_Object = default(Dictionary<string, global::ThirdParty.SimpleJSON.JSONNode>.Enumerator);155                m_Array = aArrayEnum;156            }157            public Enumerator(Dictionary<string, global::ThirdParty.SimpleJSON.JSONNode>.Enumerator aDictEnum)158            {159                type = Type.Object;160                m_Object = aDictEnum;161                m_Array = default(List<global::ThirdParty.SimpleJSON.JSONNode>.Enumerator);162            }163            public KeyValuePair<string, global::ThirdParty.SimpleJSON.JSONNode> Current164            {165                get {166                    if (type == Type.Array)167                        return new KeyValuePair<string, global::ThirdParty.SimpleJSON.JSONNode>(string.Empty, m_Array.Current);168                    else if (type == Type.Object)169                        return m_Object.Current;170                    return new KeyValuePair<string, global::ThirdParty.SimpleJSON.JSONNode>(string.Empty, null);171                }172            }173            public bool MoveNext()174            {175                if (type == Type.Array)176                    return m_Array.MoveNext();177                else if (type == Type.Object)178                    return m_Object.MoveNext();179                return false;180            }181        }182        public struct ValueEnumerator183        {184            Enumerator m_Enumerator;185            public ValueEnumerator(List<global::ThirdParty.SimpleJSON.JSONNode>.Enumerator aArrayEnum) : this(new Enumerator(aArrayEnum)) { }186            public ValueEnumerator(Dictionary<string, global::ThirdParty.SimpleJSON.JSONNode>.Enumerator aDictEnum) : this(new Enumerator(aDictEnum)) { }187            public ValueEnumerator(Enumerator aEnumerator) { m_Enumerator = aEnumerator; }188            public global::ThirdParty.SimpleJSON.JSONNode Current { get { return m_Enumerator.Current.Value; } }189            public bool MoveNext() { return m_Enumerator.MoveNext(); }190            public ValueEnumerator GetEnumerator() { return this; }191        }192        public struct KeyEnumerator193        {194            Enumerator m_Enumerator;195            public KeyEnumerator(List<global::ThirdParty.SimpleJSON.JSONNode>.Enumerator aArrayEnum) : this(new Enumerator(aArrayEnum)) { }196            public KeyEnumerator(Dictionary<string, global::ThirdParty.SimpleJSON.JSONNode>.Enumerator aDictEnum) : this(new Enumerator(aDictEnum)) { }197            public KeyEnumerator(Enumerator aEnumerator) { m_Enumerator = aEnumerator; }198            public global::ThirdParty.SimpleJSON.JSONNode Current { get { return m_Enumerator.Current.Key; } }199            public bool MoveNext() { return m_Enumerator.MoveNext(); }200            public KeyEnumerator GetEnumerator() { return this; }201        }202        public class LinqEnumerator : IEnumerator<KeyValuePair<string, global::ThirdParty.SimpleJSON.JSONNode>>, IEnumerable<KeyValuePair<string, global::ThirdParty.SimpleJSON.JSONNode>>203        {204            global::ThirdParty.SimpleJSON.JSONNode m_Node;205            Enumerator m_Enumerator;206            internal LinqEnumerator(global::ThirdParty.SimpleJSON.JSONNode aNode)207            {208                m_Node = aNode;209                if (m_Node != null)210                    m_Enumerator = m_Node.GetEnumerator();211            }212            public KeyValuePair<string, global::ThirdParty.SimpleJSON.JSONNode> Current { get { return m_Enumerator.Current; } }213            object IEnumerator.Current { get { return m_Enumerator.Current; } }214            public bool MoveNext() { return m_Enumerator.MoveNext(); }215            public void Dispose()216            {217                m_Node = null;218                m_Enumerator = new Enumerator();219            }220            public IEnumerator<KeyValuePair<string, global::ThirdParty.SimpleJSON.JSONNode>> GetEnumerator()221            {222                return new LinqEnumerator(m_Node);223            }224            public void Reset()225            {226                if (m_Node != null)227                    m_Enumerator = m_Node.GetEnumerator();228            }229            IEnumerator IEnumerable.GetEnumerator()230            {231                return new LinqEnumerator(m_Node);232            }233        }234        #endregion Enumerators235        #region common interface236        public static bool forceASCII = false; // Use Unicode by default237        public static bool longAsString = false; // lazy creator creates a JSONString instead of JSONNumber238        public abstract JSONNodeType Tag { get; }239        public virtual global::ThirdParty.SimpleJSON.JSONNode this[int aIndex] { get { return null; } set { } }240        public virtual global::ThirdParty.SimpleJSON.JSONNode this[string aKey] { get { return null; } set { } }241        public virtual string Value { get { return ""; } set { } }242        public virtual int Count { get { return 0; } }243        public virtual bool IsNumber { get { return false; } }244        public virtual bool IsString { get { return false; } }245        public virtual bool IsBoolean { get { return false; } }246        public virtual bool IsNull { get { return false; } }247        public virtual bool IsArray { get { return false; } }248        public virtual bool IsObject { get { return false; } }249        public virtual bool Inline { get { return false; } set { } }250        public virtual void Add(string aKey, global::ThirdParty.SimpleJSON.JSONNode aItem)251        {252        }253        public virtual void Add(global::ThirdParty.SimpleJSON.JSONNode aItem)254        {255            Add("", aItem);256        }257        public virtual global::ThirdParty.SimpleJSON.JSONNode Remove(string aKey)258        {259            return null;260        }261        public virtual global::ThirdParty.SimpleJSON.JSONNode Remove(int aIndex)262        {263            return null;264        }265        public virtual global::ThirdParty.SimpleJSON.JSONNode Remove(global::ThirdParty.SimpleJSON.JSONNode aNode)266        {267            return aNode;268        }269        public virtual IEnumerable<global::ThirdParty.SimpleJSON.JSONNode> Children270        {271            get272            {273                yield break;274            }275        }276        public IEnumerable<global::ThirdParty.SimpleJSON.JSONNode> DeepChildren277        {278            get279            {280                foreach (global::ThirdParty.SimpleJSON.JSONNode C in Children)281                    foreach (global::ThirdParty.SimpleJSON.JSONNode D in C.DeepChildren)282                        yield return D;283            }284        }285        public override string ToString()286        {287            StringBuilder sb = new StringBuilder();288            WriteToStringBuilder(sb, 0, 0, JSONTextMode.Compact);289            return sb.ToString();290        }291        public virtual string ToString(int aIndent)292        {293            StringBuilder sb = new StringBuilder();294            WriteToStringBuilder(sb, 0, aIndent, JSONTextMode.Indent);295            return sb.ToString();296        }297        internal abstract void WriteToStringBuilder(StringBuilder aSB, int aIndent, int aIndentInc, JSONTextMode aMode);298        public abstract Enumerator GetEnumerator();299        public IEnumerable<KeyValuePair<string, global::ThirdParty.SimpleJSON.JSONNode>> Linq { get { return new LinqEnumerator(this); } }300        public KeyEnumerator Keys { get { return new KeyEnumerator(GetEnumerator()); } }301        public ValueEnumerator Values { get { return new ValueEnumerator(GetEnumerator()); } }302        #endregion common interface303        #region typecasting properties304        public virtual double AsDouble305        {306            get307            {308                double v = 0.0;309                if (double.TryParse(Value,NumberStyles.Float, CultureInfo.InvariantCulture, out v))310                    return v;311                return 0.0;312            }313            set314            {315                Value = value.ToString(CultureInfo.InvariantCulture);316            }317        }318        public virtual int AsInt319        {320            get { return (int)AsDouble; }321            set { AsDouble = value; }322        }323        public virtual float AsFloat324        {325            get { return (float)AsDouble; }326            set { AsDouble = value; }327        }328        public virtual bool AsBool329        {330            get331            {332                bool v = false;333                if (bool.TryParse(Value, out v))334                    return v;335                return !string.IsNullOrEmpty(Value);336            }337            set338            {339                Value = (value) ? "true" : "false";340            }341        }342        public virtual long AsLong343        {344            get345            {346                long val = 0;347                if (long.TryParse(Value, out val))348                    return val;349                return 0L;350            }351            set352            {353                Value = value.ToString();354            }355        }356        public virtual global::ThirdParty.SimpleJSON.JSONArray AsArray357        {358            get359            {360                return this as global::ThirdParty.SimpleJSON.JSONArray;361            }362        }363        public virtual global::ThirdParty.SimpleJSON.JSONObject AsObject364        {365            get366            {367                return this as global::ThirdParty.SimpleJSON.JSONObject;368            }369        }370        #endregion typecasting properties371        #region operators372        public static implicit operator global::ThirdParty.SimpleJSON.JSONNode(string s)373        {374            return new global::ThirdParty.SimpleJSON.JSONString(s);375        }376        public static implicit operator string(global::ThirdParty.SimpleJSON.JSONNode d)377        {378            return (d == null) ? null : d.Value;379        }380        public static implicit operator global::ThirdParty.SimpleJSON.JSONNode(double n)381        {382            return new global::ThirdParty.SimpleJSON.JSONNumber(n);383        }384        public static implicit operator double(global::ThirdParty.SimpleJSON.JSONNode d)385        {386            return (d == null) ? 0 : d.AsDouble;387        }388        public static implicit operator global::ThirdParty.SimpleJSON.JSONNode(float n)389        {390            return new global::ThirdParty.SimpleJSON.JSONNumber(n);391        }392        public static implicit operator float(global::ThirdParty.SimpleJSON.JSONNode d)393        {394            return (d == null) ? 0 : d.AsFloat;395        }396        public static implicit operator global::ThirdParty.SimpleJSON.JSONNode(int n)397        {398            return new global::ThirdParty.SimpleJSON.JSONNumber(n);399        }400        public static implicit operator int(global::ThirdParty.SimpleJSON.JSONNode d)401        {402            return (d == null) ? 0 : d.AsInt;403        }404        public static implicit operator global::ThirdParty.SimpleJSON.JSONNode(long n)405        {406            return new global::ThirdParty.SimpleJSON.JSONNumber(n);407        }408        public static implicit operator long(global::ThirdParty.SimpleJSON.JSONNode d)409        {410            return (d == null) ? 0L : d.AsLong;411        }412        public static implicit operator global::ThirdParty.SimpleJSON.JSONNode(bool b)413        {414            return new global::ThirdParty.SimpleJSON.JSONBool(b);415        }416        public static implicit operator bool(global::ThirdParty.SimpleJSON.JSONNode d)417        {418            return (d == null) ? false : d.AsBool;419        }420        public static implicit operator global::ThirdParty.SimpleJSON.JSONNode(KeyValuePair<string, global::ThirdParty.SimpleJSON.JSONNode> aKeyValue)421        {422            return aKeyValue.Value;423        }424        public static bool operator ==(global::ThirdParty.SimpleJSON.JSONNode a, object b)425        {426            if (ReferenceEquals(a, b))427                return true;428            bool aIsNull = a is global::ThirdParty.SimpleJSON.JSONNull || ReferenceEquals(a, null) || a is global::ThirdParty.SimpleJSON.JSONLazyCreator;429            bool bIsNull = b is global::ThirdParty.SimpleJSON.JSONNull || ReferenceEquals(b, null) || b is global::ThirdParty.SimpleJSON.JSONLazyCreator;430            if (aIsNull && bIsNull)431                return true;432            return !aIsNull && a.Equals(b);433        }434        public static bool operator !=(global::ThirdParty.SimpleJSON.JSONNode a, object b)435        {436            return !(a == b);437        }438        public override bool Equals(object obj)439        {440            return ReferenceEquals(this, obj);441        }442        public override int GetHashCode()443        {444            return base.GetHashCode();445        }446        #endregion operators447        [ThreadStatic]448        static StringBuilder m_EscapeBuilder;449        internal static StringBuilder EscapeBuilder450        {451            get {452                if (m_EscapeBuilder == null)453                    m_EscapeBuilder = new StringBuilder();454                return m_EscapeBuilder;455            }456        }457        internal static string Escape(string aText)458        {459            StringBuilder sb = EscapeBuilder;460            sb.Length = 0;461            if (sb.Capacity < aText.Length + aText.Length / 10)462                sb.Capacity = aText.Length + aText.Length / 10;463            foreach (char c in aText)464            {465                switch (c)466                {467                    case '\\':468                        sb.Append("\\\\");469                        break;470                    case '\"':471                        sb.Append("\\\"");472                        break;473                    case '\n':474                        sb.Append("\\n");475                        break;476                    case '\r':477                        sb.Append("\\r");478                        break;479                    case '\t':480                        sb.Append("\\t");481                        break;482                    case '\b':483                        sb.Append("\\b");484                        break;485                    case '\f':486                        sb.Append("\\f");487                        break;488                    default:489                        if (c < ' ' || (forceASCII && c > 127))490                        {491                            ushort val = c;492                            sb.Append("\\u").Append(val.ToString("X4"));493                        }494                        else495                            sb.Append(c);496                        break;497                }498            }499            string result = sb.ToString();500            sb.Length = 0;501            return result;502        }503        static void ParseElement(global::ThirdParty.SimpleJSON.JSONNode ctx, string token, string tokenName, bool quoted)504        {505            if (quoted)506            {507                ctx.Add(tokenName, token);508                return;509            }510            string tmp = token.ToLower();511            if (tmp == "false" || tmp == "true")512                ctx.Add(tokenName, tmp == "true");513            else if (tmp == "null")514                ctx.Add(tokenName, null);515            else516            {517                double val;518                if (double.TryParse(token, NumberStyles.Float, CultureInfo.InvariantCulture, out val))519                    ctx.Add(tokenName, val);520                else521                    ctx.Add(tokenName, token);522            }523        }524        public static global::ThirdParty.SimpleJSON.JSONNode Parse(string aJSON)525        {526            Stack<global::ThirdParty.SimpleJSON.JSONNode> stack = new Stack<global::ThirdParty.SimpleJSON.JSONNode>();527            global::ThirdParty.SimpleJSON.JSONNode ctx = null;528            int i = 0;529            StringBuilder Token = new StringBuilder();530            string TokenName = "";531            bool QuoteMode = false;532            bool TokenIsQuoted = false;533            while (i < aJSON.Length) {534                switch (aJSON[i])535                {536                    case '{':537                        if (QuoteMode)538                        {539                            Token.Append(aJSON[i]);540                            break;541                        }542                        stack.Push(new global::ThirdParty.SimpleJSON.JSONObject());543                        if (ctx != null)544                        {545                            ctx.Add(TokenName, stack.Peek());546                        }547                        TokenName = "";548                        Token.Length = 0;549                        ctx = stack.Peek();550                        break;551                    case '[':552                        if (QuoteMode)553                        {554                            Token.Append(aJSON[i]);555                            break;556                        }557                        stack.Push(new global::ThirdParty.SimpleJSON.JSONArray());558                        if (ctx != null)559                        {560                            ctx.Add(TokenName, stack.Peek());561                        }562                        TokenName = "";563                        Token.Length = 0;564                        ctx = stack.Peek();565                        break;566                    case '}':567                    case ']':568                        if (QuoteMode)569                        {570                            Token.Append(aJSON[i]);571                            break;572                        }573                        if (stack.Count == 0)574                            throw new Exception("JSON Parse: Too many closing brackets");575                        stack.Pop();576                        if (Token.Length > 0 || TokenIsQuoted)577                        {578                            ParseElement(ctx, Token.ToString(), TokenName, TokenIsQuoted);579                            TokenIsQuoted = false;580                        }581                        TokenName = "";582                        Token.Length = 0;583                        if (stack.Count > 0)584                            ctx = stack.Peek();585                        break;586                    case ':':587                        if (QuoteMode)588                        {589                            Token.Append(aJSON[i]);590                            break;591                        }592                        TokenName = Token.ToString();593                        Token.Length = 0;594                        TokenIsQuoted = false;595                        break;596                    case '"':597                        QuoteMode ^= true;598                        TokenIsQuoted |= QuoteMode;599                        break;600                    case ',':601                        if (QuoteMode)602                        {603                            Token.Append(aJSON[i]);604                            break;605                        }606                        if (Token.Length > 0 || TokenIsQuoted)607                        {608                            ParseElement(ctx, Token.ToString(), TokenName, TokenIsQuoted);609                            TokenIsQuoted = false;610                        }611                        TokenName = "";612                        Token.Length = 0;613                        TokenIsQuoted = false;614                        break;615                    case '\r':616                    case '\n':617                        break;618                    case ' ':619                    case '\t':620                        if (QuoteMode)621                            Token.Append(aJSON[i]);622                        break;623                    case '\\':624                        ++i;625                        if (QuoteMode)626                        {627                            char C = aJSON[i];628                            switch (C)629                            {630                                case 't':631                                    Token.Append('\t');632                                    break;633                                case 'r':634                                    Token.Append('\r');635                                    break;636                                case 'n':637                                    Token.Append('\n');638                                    break;639                                case 'b':640                                    Token.Append('\b');641                                    break;642                                case 'f':643                                    Token.Append('\f');644                                    break;645                                case 'u':646                                    {647                                        string s = aJSON.Substring(i + 1, 4);648                                        Token.Append((char)int.Parse(649                                            s,650                                            System.Globalization.NumberStyles.AllowHexSpecifier));651                                        i += 4;652                                        break;653                                    }654                                default:655                                    Token.Append(C);656                                    break;657                            }658                        }659                        break;660                    default:661                        Token.Append(aJSON[i]);662                        break;663                }664                ++i;665            }666            if (QuoteMode)667            {668                throw new Exception("JSON Parse: Quotation marks seems to be messed up.");669            }670            return ctx;671        }672    }673    // End of JSONNode674    public partial class JSONArray : global::ThirdParty.SimpleJSON.JSONNode675    {676        List<global::ThirdParty.SimpleJSON.JSONNode> m_List = new List<global::ThirdParty.SimpleJSON.JSONNode>();677        bool inline = false;678        public override bool Inline679        {680            get { return inline; }681            set { inline = value; }682        }683        public override JSONNodeType Tag { get { return JSONNodeType.Array; } }684        public override bool IsArray { get { return true; } }685        public override Enumerator GetEnumerator() { return new Enumerator(m_List.GetEnumerator()); }686        public override global::ThirdParty.SimpleJSON.JSONNode this[int aIndex]687        {688            get689            {690                if (aIndex < 0 || aIndex >= m_List.Count)691                    return new global::ThirdParty.SimpleJSON.JSONLazyCreator(this);692                return m_List[aIndex];693            }694            set695            {696                if (value == null)697                    value = global::ThirdParty.SimpleJSON.JSONNull.CreateOrGet();698                if (aIndex < 0 || aIndex >= m_List.Count)699                    m_List.Add(value);700                else701                    m_List[aIndex] = value;702            }703        }704        public override global::ThirdParty.SimpleJSON.JSONNode this[string aKey]705        {706            get { return new global::ThirdParty.SimpleJSON.JSONLazyCreator(this); }707            set708            {709                if (value == null)710                    value = global::ThirdParty.SimpleJSON.JSONNull.CreateOrGet();711                m_List.Add(value);712            }713        }714        public override int Count715        {716            get { return m_List.Count; }717        }718        public override void Add(string aKey, global::ThirdParty.SimpleJSON.JSONNode aItem)719        {720            if (aItem == null)721                aItem = global::ThirdParty.SimpleJSON.JSONNull.CreateOrGet();722            m_List.Add(aItem);723        }724        public override global::ThirdParty.SimpleJSON.JSONNode Remove(int aIndex)725        {726            if (aIndex < 0 || aIndex >= m_List.Count)727                return null;728            global::ThirdParty.SimpleJSON.JSONNode tmp = m_List[aIndex];729            m_List.RemoveAt(aIndex);730            return tmp;731        }732        public override global::ThirdParty.SimpleJSON.JSONNode Remove(global::ThirdParty.SimpleJSON.JSONNode aNode)733        {734            m_List.Remove(aNode);735            return aNode;736        }737        public override IEnumerable<global::ThirdParty.SimpleJSON.JSONNode> Children738        {739            get740            {741                foreach (global::ThirdParty.SimpleJSON.JSONNode N in m_List)742                    yield return N;743            }744        }745        internal override void WriteToStringBuilder(StringBuilder aSB, int aIndent, int aIndentInc, JSONTextMode aMode)746        {747            aSB.Append('[');748            int count = m_List.Count;749            if (inline)750                aMode = JSONTextMode.Compact;751            for (int i = 0; i < count; i++)752            {753                if (i > 0)754                    aSB.Append(',');755                if (aMode == JSONTextMode.Indent)756                    aSB.AppendLine();757                if (aMode == JSONTextMode.Indent)758                    aSB.Append(' ', aIndent + aIndentInc);759                m_List[i].WriteToStringBuilder(aSB, aIndent + aIndentInc, aIndentInc, aMode);760            }761            if (aMode == JSONTextMode.Indent)762                aSB.AppendLine().Append(' ', aIndent);763            aSB.Append(']');764        }765    }766    // End of JSONArray767    public partial class JSONObject : global::ThirdParty.SimpleJSON.JSONNode768    {769        Dictionary<string, global::ThirdParty.SimpleJSON.JSONNode> m_Dict = new Dictionary<string, global::ThirdParty.SimpleJSON.JSONNode>();770        bool inline = false;771        public override bool Inline772        {773            get { return inline; }774            set { inline = value; }775        }776        public override JSONNodeType Tag { get { return JSONNodeType.Object; } }777        public override bool IsObject { get { return true; } }778        public override Enumerator GetEnumerator() { return new Enumerator(m_Dict.GetEnumerator()); }779        public override global::ThirdParty.SimpleJSON.JSONNode this[string aKey]780        {781            get782            {783                if (m_Dict.ContainsKey(aKey))784                    return m_Dict[aKey];785                else786                    return new global::ThirdParty.SimpleJSON.JSONLazyCreator(this, aKey);787            }788            set789            {790                if (value == null)791                    value = global::ThirdParty.SimpleJSON.JSONNull.CreateOrGet();792                if (m_Dict.ContainsKey(aKey))793                    m_Dict[aKey] = value;794                else795                    m_Dict.Add(aKey, value);796            }797        }798        public override global::ThirdParty.SimpleJSON.JSONNode this[int aIndex]799        {800            get801            {802                if (aIndex < 0 || aIndex >= m_Dict.Count)803                    return null;804                return m_Dict.ElementAt(aIndex).Value;805            }806            set807            {808                if (value == null)809                    value = global::ThirdParty.SimpleJSON.JSONNull.CreateOrGet();810                if (aIndex < 0 || aIndex >= m_Dict.Count)811                    return;812                string key = m_Dict.ElementAt(aIndex).Key;813                m_Dict[key] = value;814            }815        }816        public override int Count817        {818            get { return m_Dict.Count; }819        }820        public override void Add(string aKey, global::ThirdParty.SimpleJSON.JSONNode aItem)821        {822            if (aItem == null)823                aItem = global::ThirdParty.SimpleJSON.JSONNull.CreateOrGet();824            if (!string.IsNullOrEmpty(aKey))825            {826                if (m_Dict.ContainsKey(aKey))827                    m_Dict[aKey] = aItem;828                else829                    m_Dict.Add(aKey, aItem);830            }831            else832                m_Dict.Add(Guid.NewGuid().ToString(), aItem);833        }834        public override global::ThirdParty.SimpleJSON.JSONNode Remove(string aKey)835        {836            if (!m_Dict.ContainsKey(aKey))837                return null;838            global::ThirdParty.SimpleJSON.JSONNode tmp = m_Dict[aKey];839            m_Dict.Remove(aKey);840            return tmp;841        }842        public override global::ThirdParty.SimpleJSON.JSONNode Remove(int aIndex)843        {844            if (aIndex < 0 || aIndex >= m_Dict.Count)845                return null;846            KeyValuePair<string, global::ThirdParty.SimpleJSON.JSONNode> item = m_Dict.ElementAt(aIndex);847            m_Dict.Remove(item.Key);848            return item.Value;849        }850        public override global::ThirdParty.SimpleJSON.JSONNode Remove(global::ThirdParty.SimpleJSON.JSONNode aNode)851        {852            try853            {854                KeyValuePair<string, global::ThirdParty.SimpleJSON.JSONNode> item = m_Dict.Where(k => k.Value == aNode).First();855                m_Dict.Remove(item.Key);856                return aNode;857            }858            catch859            {860                return null;861            }862        }863        public override IEnumerable<global::ThirdParty.SimpleJSON.JSONNode> Children864        {865            get866            {867                foreach (KeyValuePair<string, global::ThirdParty.SimpleJSON.JSONNode> N in m_Dict)868                    yield return N.Value;869            }870        }871        internal override void WriteToStringBuilder(StringBuilder aSB, int aIndent, int aIndentInc, JSONTextMode aMode)872        {873            aSB.Append('{');874            bool first = true;875            if (inline)876                aMode = JSONTextMode.Compact;877            foreach (KeyValuePair<string, global::ThirdParty.SimpleJSON.JSONNode> k in m_Dict)878            {879                if (!first)880                    aSB.Append(',');881                first = false;882                if (aMode == JSONTextMode.Indent)883                    aSB.AppendLine();884                if (aMode == JSONTextMode.Indent)885                    aSB.Append(' ', aIndent + aIndentInc);886                aSB.Append('\"').Append(Escape(k.Key)).Append('\"');887                if (aMode == JSONTextMode.Compact)888                    aSB.Append(':');889                else890                    aSB.Append(" : ");891                k.Value.WriteToStringBuilder(aSB, aIndent + aIndentInc, aIndentInc, aMode);892            }893            if (aMode == JSONTextMode.Indent)894                aSB.AppendLine().Append(' ', aIndent);895            aSB.Append('}');896        }897    }898    // End of JSONObject899    public partial class JSONString : global::ThirdParty.SimpleJSON.JSONNode900    {901        string m_Data;902        public override JSONNodeType Tag { get { return JSONNodeType.String; } }903        public override bool IsString { get { return true; } }904        public override Enumerator GetEnumerator() { return new Enumerator(); }905        public override string Value906        {907            get { return m_Data; }908            set909            {910                m_Data = value;911            }912        }913        public JSONString(string aData)914        {915            m_Data = aData;916        }917        internal override void WriteToStringBuilder(StringBuilder aSB, int aIndent, int aIndentInc, JSONTextMode aMode)918        {919            aSB.Append('\"').Append(Escape(m_Data)).Append('\"');920        }921        public override bool Equals(object obj)922        {923            if (base.Equals(obj))924                return true;925            string s = obj as string;926            if (s != null)927                return m_Data == s;928            global::ThirdParty.SimpleJSON.JSONString s2 = obj as global::ThirdParty.SimpleJSON.JSONString;929            if (s2 != null)930                return m_Data == s2.m_Data;931            return false;932        }933        public override int GetHashCode()934        {935            return m_Data.GetHashCode();936        }937    }938    // End of JSONString939    public partial class JSONNumber : global::ThirdParty.SimpleJSON.JSONNode940    {941        double m_Data;942        public override JSONNodeType Tag { get { return JSONNodeType.Number; } }943        public override bool IsNumber { get { return true; } }944        public override Enumerator GetEnumerator() { return new Enumerator(); }945        public override string Value946        {947            get { return m_Data.ToString(CultureInfo.InvariantCulture); }948            set949            {950                double v;951                if (double.TryParse(value, NumberStyles.Float, CultureInfo.InvariantCulture, out v))952                    m_Data = v;953            }954        }955        public override double AsDouble956        {957            get { return m_Data; }958            set { m_Data = value; }959        }960        public override long AsLong961        {962            get { return (long)m_Data; }963            set { m_Data = value; }964        }965        public JSONNumber(double aData)966        {967            m_Data = aData;968        }969        public JSONNumber(string aData)970        {971            Value = aData;972        }973        internal override void WriteToStringBuilder(StringBuilder aSB, int aIndent, int aIndentInc, JSONTextMode aMode)974        {975            aSB.Append(Value);976        }977        static bool IsNumeric(object value)978        {979            return value is int || value is uint980                || value is float || value is double981                || value is decimal982                || value is long || value is ulong983                || value is short || value is ushort984                || value is sbyte || value is byte;985        }986        public override bool Equals(object obj)987        {988            if (obj == null)989                return false;990            if (base.Equals(obj))991                return true;992            global::ThirdParty.SimpleJSON.JSONNumber s2 = obj as global::ThirdParty.SimpleJSON.JSONNumber;993            if (s2 != null)994                return m_Data == s2.m_Data;995            if (IsNumeric(obj))996                return Convert.ToDouble(obj) == m_Data;997            return false;998        }999        public override int GetHashCode()1000        {1001            return m_Data.GetHashCode();1002        }1003    }1004    // End of JSONNumber1005    public partial class JSONBool : global::ThirdParty.SimpleJSON.JSONNode1006    {1007        bool m_Data;1008        public override JSONNodeType Tag { get { return JSONNodeType.Boolean; } }1009        public override bool IsBoolean { get { return true; } }1010        public override Enumerator GetEnumerator() { return new Enumerator(); }1011        public override string Value1012        {1013            get { return m_Data.ToString(); }1014            set1015            {1016                bool v;1017                if (bool.TryParse(value, out v))1018                    m_Data = v;1019            }1020        }1021        public override bool AsBool1022        {1023            get { return m_Data; }1024            set { m_Data = value; }1025        }1026        public JSONBool(bool aData)1027        {1028            m_Data = aData;1029        }1030        public JSONBool(string aData)1031        {1032            Value = aData;1033        }1034        internal override void WriteToStringBuilder(StringBuilder aSB, int aIndent, int aIndentInc, JSONTextMode aMode)1035        {1036            aSB.Append((m_Data) ? "true" : "false");1037        }1038        public override bool Equals(object obj)1039        {1040            if (obj == null)1041                return false;1042            if (obj is bool)1043                return m_Data == (bool)obj;1044            return false;1045        }1046        public override int GetHashCode()1047        {1048            return m_Data.GetHashCode();1049        }1050    }1051    // End of JSONBool1052    public partial class JSONNull : global::ThirdParty.SimpleJSON.JSONNode1053    {1054        static global::ThirdParty.SimpleJSON.JSONNull m_StaticInstance = new global::ThirdParty.SimpleJSON.JSONNull();1055        public static bool reuseSameInstance = true;1056        public static global::ThirdParty.SimpleJSON.JSONNull CreateOrGet()1057        {1058            if (reuseSameInstance)1059                return m_StaticInstance;1060            return new global::ThirdParty.SimpleJSON.JSONNull();1061        }1062        JSONNull() { }1063        public override JSONNodeType Tag { get { return JSONNodeType.NullValue; } }1064        public override bool IsNull { get { return true; } }1065        public override Enumerator GetEnumerator() { return new Enumerator(); }1066        public override string Value1067        {1068            get { return "null"; }1069            set { }1070        }1071        public override bool AsBool1072        {1073            get { return false; }1074            set { }1075        }1076        public override bool Equals(object obj)1077        {1078            if (object.ReferenceEquals(this, obj))1079                return true;1080            return (obj is global::ThirdParty.SimpleJSON.JSONNull);1081        }1082        public override int GetHashCode()1083        {1084            return 0;1085        }1086        internal override void WriteToStringBuilder(StringBuilder aSB, int aIndent, int aIndentInc, JSONTextMode aMode)1087        {1088            aSB.Append("null");1089        }1090    }1091    // End of JSONNull1092    internal partial class JSONLazyCreator : global::ThirdParty.SimpleJSON.JSONNode1093    {1094        global::ThirdParty.SimpleJSON.JSONNode m_Node = null;1095        string m_Key = null;1096        public override JSONNodeType Tag { get { return JSONNodeType.None; } }1097        public override Enumerator GetEnumerator() { return new Enumerator(); }1098        public JSONLazyCreator(global::ThirdParty.SimpleJSON.JSONNode aNode)1099        {1100            m_Node = aNode;1101            m_Key = null;1102        }1103        public JSONLazyCreator(global::ThirdParty.SimpleJSON.JSONNode aNode, string aKey)1104        {1105            m_Node = aNode;1106            m_Key = aKey;1107        }1108        void Set(global::ThirdParty.SimpleJSON.JSONNode aVal)1109        {1110            if (m_Key == null)1111            {1112                m_Node.Add(aVal);1113            }1114            else1115            {1116                m_Node.Add(m_Key, aVal);1117            }1118            m_Node = null; // Be GC friendly.1119        }1120        public override global::ThirdParty.SimpleJSON.JSONNode this[int aIndex]1121        {1122            get1123            {1124                return new global::ThirdParty.SimpleJSON.JSONLazyCreator(this);1125            }1126            set1127            {1128                global::ThirdParty.SimpleJSON.JSONArray tmp = new global::ThirdParty.SimpleJSON.JSONArray();1129                tmp.Add(value);1130                Set(tmp);1131            }1132        }1133        public override global::ThirdParty.SimpleJSON.JSONNode this[string aKey]1134        {1135            get1136            {1137                return new global::ThirdParty.SimpleJSON.JSONLazyCreator(this, aKey);1138            }1139            set1140            {1141                global::ThirdParty.SimpleJSON.JSONObject tmp = new global::ThirdParty.SimpleJSON.JSONObject();1142                tmp.Add(aKey, value);1143                Set(tmp);1144            }1145        }1146        public override void Add(global::ThirdParty.SimpleJSON.JSONNode aItem)1147        {1148            global::ThirdParty.SimpleJSON.JSONArray tmp = new global::ThirdParty.SimpleJSON.JSONArray();1149            tmp.Add(aItem);1150            Set(tmp);1151        }1152        public override void Add(string aKey, global::ThirdParty.SimpleJSON.JSONNode aItem)1153        {1154            global::ThirdParty.SimpleJSON.JSONObject tmp = new global::ThirdParty.SimpleJSON.JSONObject();1155            tmp.Add(aKey, aItem);1156            Set(tmp);1157        }1158        public static bool operator ==(global::ThirdParty.SimpleJSON.JSONLazyCreator a, object b)1159        {1160            if (b == null)1161                return true;1162            return System.Object.ReferenceEquals(a, b);1163        }1164        public static bool operator !=(global::ThirdParty.SimpleJSON.JSONLazyCreator a, object b)1165        {1166            return !(a == b);1167        }1168        public override bool Equals(object obj)1169        {1170            if (obj == null)1171                return true;1172            return System.Object.ReferenceEquals(this, obj);1173        }1174        public override int GetHashCode()1175        {1176            return 0;1177        }1178        public override int AsInt1179        {1180            get1181            {1182                global::ThirdParty.SimpleJSON.JSONNumber tmp = new global::ThirdParty.SimpleJSON.JSONNumber(0);1183                Set(tmp);1184                return 0;1185            }1186            set1187            {1188                global::ThirdParty.SimpleJSON.JSONNumber tmp = new global::ThirdParty.SimpleJSON.JSONNumber(value);1189                Set(tmp);1190            }1191        }1192        public override float AsFloat1193        {1194            get1195            {1196                global::ThirdParty.SimpleJSON.JSONNumber tmp = new global::ThirdParty.SimpleJSON.JSONNumber(0.0f);1197                Set(tmp);1198                return 0.0f;1199            }1200            set1201            {1202                global::ThirdParty.SimpleJSON.JSONNumber tmp = new global::ThirdParty.SimpleJSON.JSONNumber(value);1203                Set(tmp);1204            }1205        }1206        public override double AsDouble1207        {1208            get1209            {1210                global::ThirdParty.SimpleJSON.JSONNumber tmp = new global::ThirdParty.SimpleJSON.JSONNumber(0.0);1211                Set(tmp);1212                return 0.0;1213            }1214            set1215            {1216                global::ThirdParty.SimpleJSON.JSONNumber tmp = new global::ThirdParty.SimpleJSON.JSONNumber(value);1217                Set(tmp);1218            }1219        }1220        public override long AsLong1221        {1222            get1223            {1224                if (longAsString)1225                    Set(new global::ThirdParty.SimpleJSON.JSONString("0"));1226                else1227                    Set(new global::ThirdParty.SimpleJSON.JSONNumber(0.0));1228                return 0L;1229            }1230            set1231            {1232                if (longAsString)1233                    Set(new global::ThirdParty.SimpleJSON.JSONString(value.ToString()));1234                else1235                    Set(new global::ThirdParty.SimpleJSON.JSONNumber(value));1236            }1237        }1238        public override bool AsBool1239        {1240            get1241            {1242                global::ThirdParty.SimpleJSON.JSONBool tmp = new global::ThirdParty.SimpleJSON.JSONBool(false);1243                Set(tmp);1244                return false;1245            }1246            set1247            {1248                global::ThirdParty.SimpleJSON.JSONBool tmp = new global::ThirdParty.SimpleJSON.JSONBool(value);1249                Set(tmp);1250            }1251        }1252        public override global::ThirdParty.SimpleJSON.JSONArray AsArray1253        {1254            get1255            {1256                global::ThirdParty.SimpleJSON.JSONArray tmp = new global::ThirdParty.SimpleJSON.JSONArray();1257                Set(tmp);1258                return tmp;1259            }1260        }1261        public override global::ThirdParty.SimpleJSON.JSONObject AsObject1262        {1263            get1264            {1265                global::ThirdParty.SimpleJSON.JSONObject tmp = new global::ThirdParty.SimpleJSON.JSONObject();1266                Set(tmp);1267                return tmp;1268            }1269        }1270        internal override void WriteToStringBuilder(StringBuilder aSB, int aIndent, int aIndentInc, JSONTextMode aMode)1271        {1272            aSB.Append("null");1273        }1274    }1275    // End of JSONLazyCreator1276    public static class JSON1277    {1278        public static global::ThirdParty.SimpleJSON.JSONNode Parse(string aJSON)1279        {1280            return global::ThirdParty.SimpleJSON.JSONNode.Parse(aJSON);1281        }1282    }1283}...JSONNode.cs
Source:JSONNode.cs  
...85      }86    }87    public virtual bool HasKey(string aKey) => false;88    public virtual JSONNode GetValueOrDefault(string aKey, JSONNode aDefault) => aDefault;89    public override string ToString()90    {91      StringBuilder aSB = new StringBuilder();92      this.WriteToStringBuilder(aSB, 0, 0, JSONTextMode.Compact);93      return aSB.ToString();94    }95    public virtual string ToString(int aIndent)96    {97      StringBuilder aSB = new StringBuilder();98      this.WriteToStringBuilder(aSB, 0, aIndent, JSONTextMode.Indent);99      return aSB.ToString();100    }101    internal abstract void WriteToStringBuilder(102      StringBuilder aSB,103      int aIndent,104      int aIndentInc,105      JSONTextMode aMode);106    public abstract JSONNode.Enumerator GetEnumerator();107    public IEnumerable<KeyValuePair<string, JSONNode>> Linq => (IEnumerable<KeyValuePair<string, JSONNode>>) new JSONNode.LinqEnumerator(this);108    public JSONNode.KeyEnumerator Keys => new JSONNode.KeyEnumerator(this.GetEnumerator());109    public JSONNode.ValueEnumerator Values => new JSONNode.ValueEnumerator(this.GetEnumerator());110    public virtual double AsDouble111    {112      get113      {114        double result = 0.0;115        return double.TryParse(this.Value, NumberStyles.Float, (IFormatProvider) CultureInfo.InvariantCulture, out result) ? result : 0.0;116      }117      set => this.Value = value.ToString((IFormatProvider) CultureInfo.InvariantCulture);118    }119    public virtual int AsInt120    {121      get => (int) this.AsDouble;122      set => this.AsDouble = (double) value;123    }124    public virtual float AsFloat125    {126      get => (float) this.AsDouble;127      set => this.AsDouble = (double) value;128    }129    public virtual bool AsBool130    {131      get132      {133        bool result = false;134        return bool.TryParse(this.Value, out result) ? result : !string.IsNullOrEmpty(this.Value);135      }136      set => this.Value = value ? "true" : "false";137    }138    public virtual long AsLong139    {140      get141      {142        long result = 0;143        return long.TryParse(this.Value, out result) ? result : 0L;144      }145      set => this.Value = value.ToString();146    }147    public virtual JSONArray AsArray => this as JSONArray;148    public virtual JSONObject AsObject => this as JSONObject;149    public static implicit operator JSONNode(string s) => (JSONNode) new JSONString(s);150    public static implicit operator string(JSONNode d) => !(d == (object) null) ? d.Value : (string) null;151    public static implicit operator JSONNode(double n) => (JSONNode) new JSONNumber(n);152    public static implicit operator double(JSONNode d) => !(d == (object) null) ? d.AsDouble : 0.0;153    public static implicit operator JSONNode(float n) => (JSONNode) new JSONNumber((double) n);154    public static implicit operator float(JSONNode d) => !(d == (object) null) ? d.AsFloat : 0.0f;155    public static implicit operator JSONNode(int n) => (JSONNode) new JSONNumber((double) n);156    public static implicit operator int(JSONNode d) => !(d == (object) null) ? d.AsInt : 0;157    public static implicit operator JSONNode(long n) => JSONNode.longAsString ? (JSONNode) new JSONString(n.ToString()) : (JSONNode) new JSONNumber((double) n);158    public static implicit operator long(JSONNode d) => !(d == (object) null) ? d.AsLong : 0L;159    public static implicit operator JSONNode(bool b) => (JSONNode) new JSONBool(b);160    public static implicit operator bool(JSONNode d) => !(d == (object) null) && d.AsBool;161    public static implicit operator JSONNode(KeyValuePair<string, JSONNode> aKeyValue) => aKeyValue.Value;162    public static bool operator ==(JSONNode a, object b)163    {164      if ((object) a == b)165        return true;166      bool flag1 = a is JSONNull || (object) a == null || a is JSONLazyCreator;167      int num;168      switch (b)169      {170        case JSONNull _:171        case null:172          num = 1;173          break;174        default:175          num = b is JSONLazyCreator ? 1 : 0;176          break;177      }178      bool flag2 = num != 0;179      if (flag1 & flag2)180        return true;181      return !flag1 && a.Equals(b);182    }183    public static bool operator !=(JSONNode a, object b) => !(a == b);184    public override bool Equals(object obj) => (object) this == obj;185    public override int GetHashCode() => base.GetHashCode();186    internal static StringBuilder EscapeBuilder187    {188      get189      {190        if (JSONNode.m_EscapeBuilder == null)191          JSONNode.m_EscapeBuilder = new StringBuilder();192        return JSONNode.m_EscapeBuilder;193      }194    }195    internal static string Escape(string aText)196    {197      StringBuilder escapeBuilder = JSONNode.EscapeBuilder;198      escapeBuilder.Length = 0;199      if (escapeBuilder.Capacity < aText.Length + aText.Length / 10)200        escapeBuilder.Capacity = aText.Length + aText.Length / 10;201      foreach (char ch in aText)202      {203        switch (ch)204        {205          case '\b':206            escapeBuilder.Append("\\b");207            break;208          case '\t':209            escapeBuilder.Append("\\t");210            break;211          case '\n':212            escapeBuilder.Append("\\n");213            break;214          case '\f':215            escapeBuilder.Append("\\f");216            break;217          case '\r':218            escapeBuilder.Append("\\r");219            break;220          case '"':221            escapeBuilder.Append("\\\"");222            break;223          case '\\':224            escapeBuilder.Append("\\\\");225            break;226          default:227            if (ch < ' ' || JSONNode.forceASCII && ch > '\u007F')228            {229              ushort num = (ushort) ch;230              escapeBuilder.Append("\\u").Append(num.ToString("X4"));231              break;232            }233            escapeBuilder.Append(ch);234            break;235        }236      }237      string str = escapeBuilder.ToString();238      escapeBuilder.Length = 0;239      return str;240    }241    private static JSONNode ParseElement(string token, bool quoted)242    {243      if (quoted)244        return (JSONNode) token;245      string lower = token.ToLower();246      if (lower == "false" || lower == "true")247        return (JSONNode) (lower == "true");248      if (lower == "null")249        return (JSONNode) JSONNull.CreateOrGet();250      double result;251      return double.TryParse(token, NumberStyles.Float, (IFormatProvider) CultureInfo.InvariantCulture, out result) ? (JSONNode) result : (JSONNode) token;252    }253    public static JSONNode Parse(string aJSON)254    {255      Stack<JSONNode> jsonNodeStack = new Stack<JSONNode>();256      JSONNode jsonNode = (JSONNode) null;257      int index = 0;258      StringBuilder stringBuilder = new StringBuilder();259      string aKey = "";260      bool flag = false;261      bool quoted = false;262      for (; index < aJSON.Length; ++index)263      {264        switch (aJSON[index])265        {266          case '\t':267          case ' ':268            if (flag)269            {270              stringBuilder.Append(aJSON[index]);271              continue;272            }273            continue;274          case '\n':275          case '\r':276          case '\uFEFF':277            continue;278          case '"':279            flag = !flag;280            quoted |= flag;281            continue;282          case ',':283            if (flag)284            {285              stringBuilder.Append(aJSON[index]);286              continue;287            }288            if (stringBuilder.Length > 0 | quoted)289              jsonNode.Add(aKey, JSONNode.ParseElement(stringBuilder.ToString(), quoted));290            aKey = "";291            stringBuilder.Length = 0;292            quoted = false;293            continue;294          case '/':295            if (JSONNode.allowLineComments && !flag && index + 1 < aJSON.Length && aJSON[index + 1] == '/')296            {297              while (++index < aJSON.Length && aJSON[index] != '\n' && aJSON[index] != '\r')298                ;299              continue;300            }301            stringBuilder.Append(aJSON[index]);302            continue;303          case ':':304            if (flag)305            {306              stringBuilder.Append(aJSON[index]);307              continue;308            }309            aKey = stringBuilder.ToString();310            stringBuilder.Length = 0;311            quoted = false;312            continue;313          case '[':314            if (flag)315            {316              stringBuilder.Append(aJSON[index]);317              continue;318            }319            jsonNodeStack.Push((JSONNode) new JSONArray());320            if (jsonNode != (object) null)321              jsonNode.Add(aKey, jsonNodeStack.Peek());322            aKey = "";323            stringBuilder.Length = 0;324            jsonNode = jsonNodeStack.Peek();325            continue;326          case '\\':327            ++index;328            if (flag)329            {330              char ch = aJSON[index];331              switch (ch)332              {333                case 'b':334                  stringBuilder.Append('\b');335                  continue;336                case 'f':337                  stringBuilder.Append('\f');338                  continue;339                case 'n':340                  stringBuilder.Append('\n');341                  continue;342                case 'r':343                  stringBuilder.Append('\r');344                  continue;345                case 't':346                  stringBuilder.Append('\t');347                  continue;348                case 'u':349                  string s = aJSON.Substring(index + 1, 4);350                  stringBuilder.Append((char) int.Parse(s, NumberStyles.AllowHexSpecifier));351                  index += 4;352                  continue;353                default:354                  stringBuilder.Append(ch);355                  continue;356              }357            }358            else359              continue;360          case ']':361          case '}':362            if (flag)363            {364              stringBuilder.Append(aJSON[index]);365              continue;366            }367            if (jsonNodeStack.Count == 0)368              throw new Exception("JSON Parse: Too many closing brackets");369            jsonNodeStack.Pop();370            if (stringBuilder.Length > 0 | quoted)371              jsonNode.Add(aKey, JSONNode.ParseElement(stringBuilder.ToString(), quoted));372            quoted = false;373            aKey = "";374            stringBuilder.Length = 0;375            if (jsonNodeStack.Count > 0)376            {377              jsonNode = jsonNodeStack.Peek();378              continue;379            }380            continue;381          case '{':382            if (flag)383            {384              stringBuilder.Append(aJSON[index]);385              continue;386            }387            jsonNodeStack.Push((JSONNode) new JSONObject());388            if (jsonNode != (object) null)389              jsonNode.Add(aKey, jsonNodeStack.Peek());390            aKey = "";391            stringBuilder.Length = 0;392            jsonNode = jsonNodeStack.Peek();393            continue;394          default:395            stringBuilder.Append(aJSON[index]);396            continue;397        }398      }399      if (flag)400        throw new Exception("JSON Parse: Quotation marks seems to be messed up.");401      return jsonNode == (object) null ? JSONNode.ParseElement(stringBuilder.ToString(), quoted) : jsonNode;402    }403    public abstract void SerializeBinary(BinaryWriter aWriter);404    public void SaveToBinaryStream(Stream aData) => this.SerializeBinary(new BinaryWriter(aData));405    public void SaveToCompressedStream(Stream aData) => throw new Exception("Can't use compressed functions. You need include the SharpZipLib and uncomment the define at the top of SimpleJSON");406    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");407    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");408    public void SaveToBinaryFile(string aFileName)409    {410      Directory.CreateDirectory(new FileInfo(aFileName).Directory.FullName);411      using (FileStream aData = File.OpenWrite(aFileName))412        this.SaveToBinaryStream((Stream) aData);413    }414    public string SaveToBinaryBase64()415    {...ToString
Using AI Code Generation
1using System;2using System.Collections.Generic;3using System.Linq;4using System.Text;5using System.Threading.Tasks;6using SimpleJSON;7{8    {9        static void Main(string[] args)10        {11            string str = "{ \"name\": \"John\", \"age\": 30, \"cars\": [\"Ford\", \"BMW\", \"Fiat\"] }";12            JSONNode jnode = JSON.Parse(str);13            Console.WriteLine(jnode.ToString());14            Console.ReadLine();15        }16    }17}18{"name":"John","age":30,"cars":["Ford","BMW","Fiat"]}19using System;20using System.Collections.Generic;21using System.Linq;22using System.Text;23using System.Threading.Tasks;24using SimpleJSON;25{26    {27        static void Main(string[] args)28        {29            string str = "{ \"name\": \"John\", \"age\": 30, \"cars\": [\"Ford\", \"BMW\", \"Fiat\"] }";30            JSONNode jnode = JSON.Parse(str);31            Console.WriteLine(jnode.ToString(0));32            Console.ReadLine();33        }34    }35}36{37}38using System;39using System.Collections.Generic;40using System.Linq;41using System.Text;42using System.Threading.Tasks;43using SimpleJSON;44{45    {46        static void Main(string[] args)47        {48            string str = "{ \"name\": \"John\", \"age\": 30, \"cars\": [\"Ford\", \"BMW\", \"Fiat\"] }";49            JSONNode jnode = JSON.Parse(str);50            Console.WriteLine(jnode.ToString(4));51            Console.ReadLine();52        }53    }54}55{56}57using System;58using System.Collections.Generic;59using System.Linq;60using System.Text;61using System.Threading.Tasks;62using SimpleJSON;63{64    {65        static void Main(string[] args)66        {67            string str = "{ \"name\": \"John\", \"age\": 30, \"cars\": [\"Ford\", \"BMW\", \"FToString
Using AI Code Generation
1using System;2using System.Collections.Generic;3using System.Linq;4using System.Text;5using System.Threading.Tasks;6using SimpleJSON;7{8    {9        static void Main(string[] args)10        {11            JSONNode json = JSON.Parse(@"{""Name"":""John"", ""Age"":25, ""Address"":{""City"":""New York"", ""State"":""New York""}}");12            Console.WriteLine(json.ToString());13            Console.ReadKey();14        }15    }16}17{ "Name": "John", "Age": 25, "Address": { "City": "New York", "State": "New York" } }18using System;19using System.Collections.Generic;20using System.Linq;21using System.Text;22using System.Threading.Tasks;23using SimpleJSON;24{25    {26        static void Main(string[] args)27        {28            JSONNode json = JSON.Parse(@"{""Name"":""John"", ""Age"":25, ""Address"":{""City"":""New York"", ""State"":""New York""}}");29            Console.WriteLine(json.ToString());30            Console.ReadKey();31        }32    }33}34{ "Name": "John", "Age": 25, "Address": { "City": "New York", "State": "New York" } }35using System;36using System.Collections.Generic;37using System.Linq;38using System.Text;39using System.Threading.Tasks;40using SimpleJSON;41{42    {43        static void Main(string[] args)44        {45            JSONNode json = JSON.Parse(@"{""Name"":""John"", ""Age"":25, ""Address"":{""City"":""New York"", ""State"":""New York""}}");46            Console.WriteLine(json.ToString());47            Console.ReadKey();48        }49    }50}51{ "Name": "John", "Age": 25, "Address": { "City": "New York", "State": "New York" } }52using System;53using System.Collections.Generic;54using System.Linq;55using System.Text;56using System.Threading.Tasks;57using SimpleJSON;58{ToString
Using AI Code Generation
1using System;2using System.Collections.Generic;3using System.Linq;4using System.Text;5using SimpleJSON;6{7    {8        static void Main(string[] args)9        {10            JSONClass json = new JSONClass();11            json["name"] = "John";12            json["age"] = "30";13            json["address"] = "New York";14            json["phone"] = "1234567890";ToString
Using AI Code Generation
1using System;2using System.Collections.Generic;3using System.Linq;4using System.Text;5using SimpleJSON;6{7    {8        static void Main(string[] args)9        {10            var json = JSON.Parse(@"11{12        { ""name"": ""Ford"", ""models"": [ ""Fiesta"", ""Focus"", ""Mustang"" ] },13        { ""name"": ""BMW"", ""models"": [ ""320"", ""X3"", ""X5"" ] },14        { ""name"": ""Fiat"", ""models"": [ ""500"", ""Panda"" ] }15}");16            var cars = json["cars"].AsArray;17            foreach (var car in cars)18            {19                Console.WriteLine(car.ToString());20            }21            Console.ReadLine();22        }23    }24}25{"name":"Ford","models":["Fiesta","Focus","Mustang"]}26{"name":"BMW","models":["320","X3","X5"]}27{"name":"Fiat","models":["500","Panda"]}28using System;29using System.Collections.Generic;30using System.Linq;31using System.Text;32using SimpleJSON;33{34    {35        static void Main(string[] args)36        {37            var json = JSON.Parse(@"38{39        { ""name"": ""Ford"", ""models"": [ ""Fiesta"", ""Focus"", ""Mustang"" ] },40        { ""name"": ""BMW"", ""models"": [ ""320"", ""X3"", ""X5"" ] },41        { ""name"": ""Fiat"", ""models"": [ ""500"", ""Panda"" ] }42}");43            var cars = json["cars"].AsArray;44            foreach (var car in cars)45            {46                Console.WriteLine(car.ToString());47            }48            Console.ReadLine();49        }50    }51}52{"name":"Ford","models":["Fiesta","Focus","Mustang"]}53{"name":"BMW","models":["320","X3","X5"]}54{"name":"Fiat","models":["500","Panda"]}ToString
Using AI Code Generation
1using System;2using SimpleJSON;3{4    static void Main()5    {6        var json = JSON.Parse(@"{7                { ""name"": ""Ford"", ""models"": [""Fiesta"", ""Focus"", ""Mustang""] },8                { ""name"": ""BMW"", ""models"": [""320"", ""X3"", ""X5""] },9                { ""name"": ""Fiat"", ""models"": [""500"", ""Panda""] }10        }");11        foreach (var car in json["cars"])12        {13            Console.WriteLine(car.ToString());14        }15    }16}17using System;18using SimpleJSON;19{20    static void Main()21    {22        var json = JSON.Parse(@"{23                { ""name"": ""Ford"", ""models"": [""Fiesta"", ""Focus"", ""Mustang""] },24                { ""name"": ""BMW"", ""models"": [""320"", ""X3"", ""X5""] },25                { ""name"": ""Fiat"", ""models"": [""500"", ""Panda""] }26        }");27        Console.WriteLine(json["cars"].ToString());28    }29}30using System;31using SimpleJSON;32{33    static void Main()34    {35        var json = JSON.Parse(@"{36                { ""name"": ""Ford"", ""models"": [""Fiesta"", ""Focus"", ""Mustang""] },37                { ""name"": ""BMW"", ""models"": [ToString
Using AI Code Generation
1using System;2using SimpleJSON;3{4    {5        static void Main(string[] args)6        {7            var json = new JSONClass();8            json.Add("name", "John");9            json.Add("age", "20");10            Console.WriteLine("JSON string representation:");11            Console.WriteLine(json.ToString());12        }13    }14}15{16}ToString
Using AI Code Generation
1using System;2using SimpleJSON;3{4    public static void Main()5    {6        string jsonString = @"{7                { 'name': 'Ford', 'models': ['Fiesta', 'Focus', 'Mustang'] },8                { 'name': 'BMW', 'models': ['320', 'X3', 'X5'] },9                { 'name': 'Fiat', 'models': ['500', 'Panda'] }10        }";11        var n = JSON.Parse(jsonString);12        Console.WriteLine(n.ToString());13    }14}15{16        {17        },18        {19        },20        {21        }22}ToString
Using AI Code Generation
1using SimpleJSON;2using System.Collections.Generic;3using System;4{5    public static void Main()6    {7        var json = new JSONClass();8        json.Add("name", "John");9        json.Add("age", "25");10        json.Add("email", "ToString
Using AI Code Generation
1using System;2using SimpleJSON;3public class example {4   public static void Main() {5      string jsonString = @"{6         'address': {7         }8      }";9      var N = JSON.Parse(jsonString);10      Console.WriteLine("The JSON string is: " + N.ToString());11   }12}13The JSON string is: {"name":"Manish","age":21,"address":{"street":"xyz","city":"abc","state":"xyz"}}Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.
You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.
Get 100 minutes of automation test minutes FREE!!
