/// <summary> /// Parses the next token from the input and returns it. /// </summary> private JsonToken Parse() { char ch = NextClean(); // // String // if (ch == '"' || ch == '\'') { return(Yield(JsonToken.String(NextString(ch)))); } // // Object // if (ch == '{') { _reader.Back(); return(ParseObject()); } // // Array // if (ch == '[') { _reader.Back(); return(ParseArray()); } // // Handle unquoted text. This could be the values true, false, or // null, or it can be a number. An implementation (such as this one) // is allowed to also accept non-standard forms. // // Accumulate characters until we reach the end of the text or a // formatting character. // StringBuilder sb = new StringBuilder(); char b = ch; while (ch >= ' ' && ",:]}/\\\"[{;=#".IndexOf(ch) < 0) { sb.Append(ch); ch = _reader.Next(); } _reader.Back(); string s = sb.ToString().Trim(); if (s.Length == 0) { throw new JsonException("Missing value."); } // // Boolean // if (s == JsonBoolean.TrueText || s == JsonBoolean.FalseText) { return(Yield(JsonToken.Boolean(s == JsonBoolean.TrueText))); } // // Null // if (s == JsonNull.Text) { return(Yield(JsonToken.Null())); } // // Number // if ((b >= '0' && b <= '9') || b == '.' || b == '-' || b == '+') { double unused; if (!double.TryParse(s, NumberStyles.Float, CultureInfo.InvariantCulture, out unused)) { throw new JsonException(string.Format("The text '{0}' has the incorrect syntax for a number.", s)); } return(Yield(JsonToken.Number(s))); } // // Treat as String in all other cases, e.g. when unquoted. // return(Yield(JsonToken.String(s))); }
/// <summary> /// Yields control back to the reader's user while updating the /// reader with the new found token and its text. /// </summary> private JsonToken Yield(JsonToken token) { return(Yield(token, null)); }