public static JsonToken GetNextToken(JsonBuffer buffer)
{
// skip leading whitespace
var c = buffer.Read();
while (c != -1 && char.IsWhiteSpace((char)c))
{
c = buffer.Read();
}
if (c == -1)
{
return new JsonToken(JsonTokenType.EndOfFile, "<eof>");
}
// leading character determines token type
switch (c)
{
case '{': return new JsonToken(JsonTokenType.BeginObject, "{");
case '}': return new JsonToken(JsonTokenType.EndObject, "}");
case '[': return new JsonToken(JsonTokenType.BeginArray, "[");
case ']': return new JsonToken(JsonTokenType.EndArray, "]");
case '(': return new JsonToken(JsonTokenType.LeftParen, "(");
case ')': return new JsonToken(JsonTokenType.RightParen, ")");
case ':': return new JsonToken(JsonTokenType.Colon, ":");
case ',': return new JsonToken(JsonTokenType.Comma, ",");
case '\'':
case '"':
return GetStringToken(buffer, (char)c);
case '/': return GetRegularExpressionToken(buffer);
default:
if (c == '-' || char.IsDigit((char)c))
{
return GetNumberToken(buffer, c);
}
else if (c == '$' || c == '_' || char.IsLetter((char)c))
{
return GetUnquotedStringToken(buffer);
}
else
{
buffer.UnRead(c);
throw new Exception(FormatMessage("Invalid JSON input", buffer, buffer.Position));
}
}
}