private static string ReadString(CharBuffer charBuffer) { charBuffer.Next(); StringBuilder sb = new StringBuilder(); while (charBuffer.HasMore()) { char c = charBuffer.Next(); if (c == '\\') { sb.Append(c); c = charBuffer.Head(); if (!IsEscape(c)) { ThrowHelper.Throw("invalid escape char \\" + c); } sb.Append(c); } else if (c == '"') { return(sb.ToString()); } else if (c == '\r' || c == '\n') { ThrowHelper.Throw("Invalid character"); } else { sb.Append(c); } } ThrowHelper.Throw("unfinished string"); return(null); }
public static Queue <JsonToken> GetTokens(CharBuffer charBuffer) { Queue <JsonToken> tokens = new Queue <JsonToken>(); while (charBuffer.HasMore()) { JsonToken jsonToken = Read(charBuffer); if (jsonToken != null) { tokens.Enqueue(jsonToken); } } return(tokens); }
private static JsonToken Read(CharBuffer charBuffer) { char c = charBuffer.Head(); while (IsWhiteSpace(c) && charBuffer.HasMore()) { charBuffer.Next(); if (charBuffer.HasMore()) { c = charBuffer.Head(); } else { return(null); } } switch (c) { case '{': return(new JsonToken(JsonToken.TokenType.BeginObject, charBuffer.Next())); case '}': return(new JsonToken(JsonToken.TokenType.EndObject, charBuffer.Next())); case '[': return(new JsonToken(JsonToken.TokenType.BeginArray, charBuffer.Next())); case ']': return(new JsonToken(JsonToken.TokenType.EndArray, charBuffer.Next())); case ',': return(new JsonToken(JsonToken.TokenType.SepComma, charBuffer.Next())); case ':': return(new JsonToken(JsonToken.TokenType.SepColon, charBuffer.Next())); case 'n': return(new JsonToken(JsonToken.TokenType.Null, ReadNull(charBuffer))); case 't': case 'f': return(new JsonToken(JsonToken.TokenType.Boolean, ReadBoolean(charBuffer))); case '"': return(new JsonToken(JsonToken.TokenType.String, ReadString(charBuffer))); case '-': case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case '.': return(new JsonToken(JsonToken.TokenType.Number, ReadNumber(charBuffer))); default: ThrowHelper.Throw("unknown char :" + c); break; } return(null); }