internal static string ParseString(StringReader reader) { string str = ""; Json.ReadWhitespace(reader); if (reader.Read() != '\"') { return(null); } while (reader.Peek() != '\"') { int raw = reader.Read(); if (raw == -1) { return(null); } char c = (char)raw; if (c == '\\') { if (reader.Peek() == -1) { return(null); } char special = (char)reader.Read(); if (special == '\'' || special == '\"' || special == '\\') { str += special; } else { str += c; } } else { str += c; } if (reader.Peek() == -1) { return(null); } } reader.Read(); //Discard last quote return(str); }
internal static JsonArray Parse(StringReader reader) { Json.ReadWhitespace(reader); if (reader.Read() != '[') { return(null); } JsonArray array = new JsonArray(); Json.ReadWhitespace(reader); while ((reader.Peek() != ']') && (reader.Peek() != -1)) { JsonValue value = Json.ParseValue(reader); if (value.isEmpty) { return(null); } array.Values.Add(value.Value); Json.ReadWhitespace(reader); if (reader.Peek() == ',') { reader.Read(); //Discard separator Json.ReadWhitespace(reader); if (reader.Peek() == ']' || reader.Peek() == -1) { return(null); } } Json.ReadWhitespace(reader); //Prepare for next loop } Json.ReadWhitespace(reader); if (reader.Read() != ']') { return(null); } else { return(array); } }
private static bool checkForNull(StringReader reader) { Json.ReadWhitespace(reader); if (reader.Peek() == 'n' || reader.Peek() == 'N') { reader.Read(); if (reader.Peek() == 'u' || reader.Peek() == 'U') { reader.Read(); if (reader.Peek() == 'l' || reader.Peek() == 'L') { reader.Read(); if (reader.Peek() == 'l' || reader.Peek() == 'L') { reader.Read(); return(true); } } } } return(false); }
internal static JsonValue ParseValue(StringReader reader) { Json.ReadWhitespace(reader); if (reader.Peek() == '{') { return(new JsonValue(false, JsonObject.Parse(reader))); } else if (reader.Peek() == '[') { return(new JsonValue(false, JsonArray.Parse(reader))); } else if (reader.Peek() == '\"') { string str = Json.ParseString(reader); if (str == null) { return(new JsonValue(true)); } else { return(new JsonValue(false, str)); } } else if (reader.Peek() == -1) { return(new JsonValue(true)); } else { if ((reader.Peek() == 'n') || (reader.Peek() == 'N')) { if (checkForNull(reader)) { return(new JsonValue(false, null)); } else { return(new JsonValue(true)); } } else if ((reader.Peek() == 't') || (reader.Peek() == 'T') || (reader.Peek() == 'f') || (reader.Peek() == 'F')) { string str = ""; for (int i = 0; i < "true".Length; i++) { str += (char)reader.Read(); } bool b; if (bool.TryParse(str, out b)) { return(new JsonValue(false, b)); } str += (char)reader.Read(); if (bool.TryParse(str, out b)) { return(new JsonValue(false, b)); } else { return(new JsonValue(true)); } } string number = ""; while (reader.Peek() == '-' || reader.Peek() == '.' || char.IsDigit((char)reader.Peek())) { number += (char)reader.Read(); } double d; long lg; if (long.TryParse(number, out lg)) { return(new JsonValue(false, lg)); } else if (double.TryParse(number, out d)) { return(new JsonValue(false, d)); } else { return(new JsonValue(true)); } } }