ProxyArray DecodeArray()
        {
            var proxy = new ProxyArray();

            // Ditch opening bracket.
            json.Read();

            // [
            var parsing = true;

            while (parsing)
            {
                var nextToken = NextToken;

                // ReSharper disable once SwitchStatementMissingSomeCases
                switch (nextToken)
                {
                case Token.None:
                    return(null);

                case Token.Comma:
                    continue;

                case Token.CloseBracket:
                    parsing = false;
                    break;

                default:
                    proxy.Add(DecodeByToken(nextToken));
                    break;
                }
            }

            return(proxy);
        }
        // ReSharper disable once UnusedMember.Local
        static void DecodeMultiRankArray <T>(ProxyArray arrayData, Array array, int arrayRank, int[] indices)
        {
            var count = arrayData.Count;

            for (var i = 0; i < count; i++)
            {
                indices[arrayRank - 1] = i;
                if (arrayRank < array.Rank)
                {
                    DecodeMultiRankArray <T>(arrayData[i] as ProxyArray, array, arrayRank + 1, indices);
                }
                else
                {
                    array.SetValue(DecodeType <T>(arrayData[i]), indices);
                }
            }
        }
        void EncodeProxyArray(ProxyArray value)
        {
            if (value.Count == 0)
            {
                builder.Append("[]");
            }
            else
            {
                AppendOpenBracket();

                var firstItem = true;
                foreach (var obj in value)
                {
                    AppendComma(firstItem);
                    EncodeValue(obj, false);
                    firstItem = false;
                }

                AppendCloseBracket();
            }
        }