/// <inheritdoc />
 public JsonItem ParseNext()
 {
     this.state = JsonStringParseState.Start;
     while (this.state != JsonStringParseState.End)
     {
         if (this.Buffer.EndOfStream)
         {
             this.MakeEosError('\"');
         }
         switch (this.state)
         {
             case JsonStringParseState.Start:
                 if (this.Consume('"'))
                 {
                     this.state = JsonStringParseState.InString;
                 }
                 else
                 {
                     return this.MakeError('"');
                 }
                 break;
             case JsonStringParseState.InString:
                 if (this.Consume('\\'))
                 {
                     this.state = JsonStringParseState.Escaping;
                 }
                 else if (this.Consume('"'))
                 {
                     this.state = JsonStringParseState.End;
                 }
                 else if (this.Pop())
                 {
                     this.stringBuilder.Append(this.OutChar);
                 }
                 break;
             case JsonStringParseState.InHex:
                 ushort value = 0;
                 for (int i = 0; i < 4; i++)
                 {
                     if (this.Consume(Hex))
                     {
                         value <<= 4;
                         value |= ushort.Parse(this.OutChar.ToString(CultureInfo.InvariantCulture), NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture);
                     }
                     else
                     {
                         return this.MakeError(Hex);
                     }
                 }
                 this.stringBuilder.Append((char)value);
                 this.state = JsonStringParseState.InString;
                 break;
             case JsonStringParseState.Escaping:
                 if (this.Consume('"', '\\', '/'))
                 {
                     this.state = JsonStringParseState.InString;
                     this.stringBuilder.Append(this.OutChar);
                 }
                 else if (this.Consume('b', 'f', 'n', 'r', 't', 'u'))
                 {
                     switch (this.OutChar)
                     {
                         case 'b':
                             this.stringBuilder.Append('\b');
                             this.state = JsonStringParseState.InString;
                             break;
                         case 'f':
                             this.stringBuilder.Append('\f');
                             this.state = JsonStringParseState.InString;
                             break;
                         case 'n':
                             this.stringBuilder.Append('\n');
                             this.state = JsonStringParseState.InString;
                             break;
                         case 'r':
                             this.stringBuilder.Append('\r');
                             this.state = JsonStringParseState.InString;
                             break;
                         case 't':
                             this.stringBuilder.Append('\t');
                             this.state = JsonStringParseState.InString;
                             break;
                         case 'u':
                             this.state = JsonStringParseState.InHex;
                             break;
                     }
                 }
                 else if (this.Pop())
                 {
                     this.stringBuilder.Append(this.OutChar);
                     this.state = JsonStringParseState.InString;
                 }
                 else
                 {
                     return this.MakeError('"', '\\', '/', 'b', 'f', 'n', 'r', 't', 'u');
                 }
                 break;
         }
     }
     return new JsonString(this.stringBuilder.ToString());
 }
        /// <inheritdoc />
        public JsonItem ParseNext()
        {
            this.state = JsonStringParseState.Start;
            while (this.state != JsonStringParseState.End)
            {
                if (this.Buffer.EndOfStream)
                {
                    this.MakeEosError('\"');
                }
                switch (this.state)
                {
                case JsonStringParseState.Start:
                    if (this.Consume('"'))
                    {
                        this.state = JsonStringParseState.InString;
                    }
                    else
                    {
                        return(this.MakeError('"'));
                    }
                    break;

                case JsonStringParseState.InString:
                    if (this.Consume('\\'))
                    {
                        this.state = JsonStringParseState.Escaping;
                    }
                    else if (this.Consume('"'))
                    {
                        this.state = JsonStringParseState.End;
                    }
                    else if (this.Pop())
                    {
                        this.stringBuilder.Append(this.OutChar);
                    }
                    break;

                case JsonStringParseState.InHex:
                    ushort value = 0;
                    for (int i = 0; i < 4; i++)
                    {
                        if (this.Consume(Hex))
                        {
                            value <<= 4;
                            value  |= ushort.Parse(this.OutChar.ToString(CultureInfo.InvariantCulture), NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture);
                        }
                        else
                        {
                            return(this.MakeError(Hex));
                        }
                    }
                    this.stringBuilder.Append((char)value);
                    this.state = JsonStringParseState.InString;
                    break;

                case JsonStringParseState.Escaping:
                    if (this.Consume('"', '\\', '/'))
                    {
                        this.state = JsonStringParseState.InString;
                        this.stringBuilder.Append(this.OutChar);
                    }
                    else if (this.Consume('b', 'f', 'n', 'r', 't', 'u'))
                    {
                        switch (this.OutChar)
                        {
                        case 'b':
                            this.stringBuilder.Append('\b');
                            this.state = JsonStringParseState.InString;
                            break;

                        case 'f':
                            this.stringBuilder.Append('\f');
                            this.state = JsonStringParseState.InString;
                            break;

                        case 'n':
                            this.stringBuilder.Append('\n');
                            this.state = JsonStringParseState.InString;
                            break;

                        case 'r':
                            this.stringBuilder.Append('\r');
                            this.state = JsonStringParseState.InString;
                            break;

                        case 't':
                            this.stringBuilder.Append('\t');
                            this.state = JsonStringParseState.InString;
                            break;

                        case 'u':
                            this.state = JsonStringParseState.InHex;
                            break;
                        }
                    }
                    else if (this.Pop())
                    {
                        this.stringBuilder.Append(this.OutChar);
                        this.state = JsonStringParseState.InString;
                    }
                    else
                    {
                        return(this.MakeError('"', '\\', '/', 'b', 'f', 'n', 'r', 't', 'u'));
                    }
                    break;
                }
            }
            return(new JsonString(this.stringBuilder.ToString()));
        }