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);
        }
Exemple #2
0
        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));
                }
            }
        }