private static object DeserializeArray(JsonReaderBase reader)
        {
            if (reader.ReadChar() != '[')
            {
                throw new FormatException();
            }
            var collection = new List <object>();
            var first      = true;

            while (true)
            {
                reader.SkipSpace();
                if (reader.IsEnd)
                {
                    throw new FormatException("配列の閉じ括弧が見つかりません。");
                }
                if (reader.Peek() == ']')
                {
                    reader.ReadChar();
                    break;
                }
                if (!first)
                {
                    if (reader.Peek() != ',')
                    {
                        throw new FormatException("配列の区切り文字が見つかりません。");
                    }
                    reader.ReadChar();
                }
                reader.SkipSpace();
                collection.Add(Deserialize(reader));
                first = false;
            }
            return(collection.ToArray());
        }
        private static object DeserializeObject(JsonReaderBase reader)
        {
            if (reader.ReadChar() != '{')
            {
                throw new FormatException();
            }
            var dic   = new Dictionary <string, object>();
            var first = true;

            while (true)
            {
                reader.SkipSpace();
                if (reader.IsEnd)
                {
                    throw new FormatException("オブジェクトの閉じ括弧が見つかりません。");
                }
                if (reader.Peek() == '}')
                {
                    reader.ReadChar();
                    break;
                }
                if (!first)
                {
                    if (reader.Peek() != ',')
                    {
                        throw new FormatException("オブジェクトの区切り文字','が見つかりません。");
                    }
                    reader.ReadChar();
                }
                reader.SkipSpace();
                var key = DeserializeString(reader);
                reader.SkipSpace();
                if (reader.Peek() != ':')
                {
                    throw new FormatException("オブジェクトの区切り文字':'が見つかりません。");
                }
                reader.ReadChar();
                reader.SkipSpace();
                var value = Deserialize(reader);
                dic[key] = value;
                first    = false;
            }
            return(dic);
        }
        private static object Deserialize(JsonReaderBase reader)
        {
            reader.SkipSpace();
            switch (reader.Peek())
            {
            case '[':
                return(DeserializeArray(reader));

            case '{':
                return(DeserializeObject(reader));

            case '"':
                return(DeserializeString(reader));

            case 't':     // true
                if (reader.ReadStr(4) != "true")
                {
                    throw new FormatException();
                }
                return(true);

            case 'f':     // false
                if (reader.ReadStr(5) != "false")
                {
                    throw new FormatException();
                }
                return(false);

            case 'n':     // null
                if (reader.ReadStr(4) != "null")
                {
                    throw new FormatException();
                }
                return(null);

            case '0':
            case '1':
            case '2':
            case '3':
            case '4':
            case '5':
            case '6':
            case '7':
            case '8':
            case '9':
                return(DeserializeNumber(1, reader));

            case '-':
                reader.ReadChar();
                return(DeserializeNumber(-1, reader));

            default:
                throw new FormatException();
            }
        }