private void SkipEmpty()
        {
            var nextByte = (byte)_str[_index];

            while (Utf8Span.IsWhiteSpace(nextByte))
            {
                _index++;
                nextByte = (byte)_str[_index];
            }
        }
        public JsonDb.JsonValueType GetJsonDb.JsonValueType()
        {
            var nextByte = (byte)_str[_index];

            while (Utf8Span.IsWhiteSpace(nextByte))
            {
                _index++;
                nextByte = (byte)_str[_index];
            }

            if (nextByte == '"')
            {
                return JsonDb.JsonValueType.String;
            }

            if (nextByte == '{')
            {
                return JsonDb.JsonValueType.Object;
            }

            if (nextByte == '[')
            {
                return JsonDb.JsonValueType.Array;
            }

            if (nextByte == 't')
            {
                return JsonDb.JsonValueType.True;
            }

            if (nextByte == 'f')
            {
                return JsonDb.JsonValueType.False;
            }

            if (nextByte == 'n')
            {
                return JsonDb.JsonValueType.Null;
            }

            if (nextByte == '-' || (nextByte >= '0' && nextByte <= '9'))
            {
                return JsonDb.JsonValueType.Number;
            }

            throw new FormatException("Invalid json, tried to read char '" + nextByte + "'.");
        }
        private void MoveToNextTokenType()
        {
            var nextByte = (byte)_str[_index];
            while (Utf8Span.IsWhiteSpace(nextByte))
            {
                _index++;
                nextByte = (byte)_str[_index];
            }

            switch (TokenType)
            {
                case JsonTokenType.ObjectStart:
                    if (nextByte != '}')
                    {
                        TokenType = JsonTokenType.Property;
                        return;
                    }
                    break;
                case JsonTokenType.ObjectEnd:
                    if (nextByte == ',')
                    {
                        _index++;
                        if (_insideObject == _insideArray)
                        {
                            TokenType = !_jsonStartIsObject ? JsonTokenType.Property : JsonTokenType.Value;
                            return;
                        }
                        TokenType = _insideObject > _insideArray ? JsonTokenType.Property : JsonTokenType.Value;
                        return;
                    }
                    break;
                case JsonTokenType.ArrayStart:
                    if (nextByte != ']')
                    {
                        TokenType = JsonTokenType.Value;
                        return;
                    }
                    break;
                case JsonTokenType.ArrayEnd:
                    if (nextByte == ',')
                    {
                        _index++;
                        if (_insideObject == _insideArray)
                        {
                            TokenType = !_jsonStartIsObject ? JsonTokenType.Property : JsonTokenType.Value;
                            return;
                        }
                        TokenType = _insideObject > _insideArray ? JsonTokenType.Property : JsonTokenType.Value;
                        return;
                    }
                    break;
                case JsonTokenType.Property:
                    if (nextByte == ',')
                    {
                        _index++;
                        return;
                    }
                    break;
                case JsonTokenType.Value:
                    if (nextByte == ',')
                    {
                        _index++;
                        return;
                    }
                    break;
            }

            _index++;
            switch (nextByte)
            {
                case (byte)'{':
                    _insideObject++;
                    TokenType = JsonTokenType.ObjectStart;
                    return;
                case (byte)'}':
                    _insideObject--;
                    TokenType = JsonTokenType.ObjectEnd;
                    return;
                case (byte)'[':
                    _insideArray++;
                    TokenType = JsonTokenType.ArrayStart;
                    return;
                case (byte)']':
                    _insideArray--;
                    TokenType = JsonTokenType.ArrayEnd;
                    return;
                default:
                    throw new FormatException("Unable to get next token type. Check json format.");
            }
        }