예제 #1
0
        public static JsonArray Parser(JsonTokenList tokenList)
        {
            JsonArray result = new JsonArray();

            for (int i = 1; i < tokenList.Count() - 1; ++i)
            {
                switch (tokenList[i].Type)
                {
                case JsonTokenType.STRING:
                    result.Add(new JsonValue(tokenList[i].Value, JsonValueType.STRING));
                    break;

                case JsonTokenType.NUMBER:
                    result.Add(new JsonValue(Double.Parse(tokenList[i].Value), JsonValueType.NUMBER));
                    break;

                case JsonTokenType.NULL:
                    result.Add(new JsonValue(null, JsonValueType.NULL));
                    break;

                case JsonTokenType.BOOLEAN:
                    result.Add(new JsonValue(bool.Parse(tokenList[i].Value), JsonValueType.NUMBER));
                    break;

                case JsonTokenType.START_OBJECT:
                {
                    JsonTokenList JsonObj = new JsonTokenList();
                    while (i < tokenList.Count())
                    {
                        JsonObj.Add(tokenList[i]);
                        if (tokenList[i].Type == JsonTokenType.END_OBJECT)
                        {
                            break;
                        }
                        ++i;
                    }
                    result.Add(new JsonValue(JsonObject.Parser(JsonObj), JsonValueType.OBJECT));
                }
                break;

                case JsonTokenType.START_ARRAY:
                {
                    JsonTokenList JsonArr = new JsonTokenList();
                    while (i < tokenList.Count())
                    {
                        JsonArr.Add(tokenList[i]);
                        if (tokenList[i].Type == JsonTokenType.END_ARRAY)
                        {
                            break;
                        }
                        ++i;
                    }
                    result.Add(new JsonValue(JsonArray.Parser(JsonArr), JsonValueType.ARRAY));
                }
                break;
                }
            }
            return(result);
        }
예제 #2
0
        public static JsonTokenList Tokenizer(string str)
        {
            str = str.Trim();
            JsonTokenList result = new JsonTokenList();
            int           OBJ_SIGN = 0, ARR_SIGN = 0;

            for (int i = 0; i < str.Length; ++i)
            {
                switch (str[i])
                {
                case '{': result.Add(new JsonToken("{", JsonTokenType.START_OBJECT)); ++OBJ_SIGN; break;

                case '}': result.Add(new JsonToken("}", JsonTokenType.END_OBJECT)); --OBJ_SIGN; break;

                case '[': result.Add(new JsonToken("[", JsonTokenType.START_ARRAY)); ++ARR_SIGN; break;

                case ']': result.Add(new JsonToken("]", JsonTokenType.END_ARRAY)); --ARR_SIGN; break;

                case ',':
                    result.Add(new JsonToken(",", JsonTokenType.COLON));
                    if (i == 0 || i == str.Length - 1 || str[i + 1] == '}' || str[i + 1] == ']')
                    {
                        throw new FormatException("The string format is incorrect.");
                    }
                    break;

                case ':':
                    result.Add(new JsonToken(":", JsonTokenType.COMMA));
                    if (i == str.Length - 1 || str[i + 1] == '}' || str[i + 1] == ']' || str[i - 1] == '{' || str[i - 1] == '[')
                    {
                        throw new FormatException("The string format is incorrect.");
                    }
                    break;

                case '"':
                {
                    String output   = null;
                    bool   IsEscape = false;
                    for (i += 1; true; ++i)
                    {
                        if (i >= str.Length)
                        {
                            throw new FormatException("The string format is incorrect.");
                        }
                        if (str[i] == '\\')
                        {
                            IsEscape = !IsEscape;
                        }
                        else if (str[i] == '"' && !IsEscape)
                        {
                            break;
                        }
                        else
                        {
                            IsEscape = false;
                        }
                        output += str[i];
                    }
                    result.Add(new JsonToken(output, JsonTokenType.STRING));
                }
                break;

                case ' ': break;

                default:
                {
                    if (str[i] == '\n' || str[i] == '\r' || str[i] == '\t' || str[i] == '\v' || str[i] == '\f')
                    {
                        break;
                    }
                    String        output = null;
                    JsonTokenType type;
                    while (i < str.Length && str[i] != ',' && str[i] != '}' && str[i] != ']' && str[i] != ' ')
                    {
                        if (str[i] == '\n' || str[i] == '\r' || str[i] == '\t' || str[i] == '\v' || str[i] == '\f')
                        {
                            break;
                        }
                        output += str[i];
                        ++i;
                    }
                    if (output == "true" || output == "false")
                    {
                        type = JsonTokenType.BOOLEAN;
                    }
                    else if (output == "null")
                    {
                        type = JsonTokenType.NULL;
                    }
                    else
                    {
                        type = JsonTokenType.NUMBER;
                        if (!double.TryParse(output, out _))
                        {
                            throw new FormatException("The string format is incorrect.");
                        }
                    }
                    result.Add(new JsonToken(output, type));
                    if (i < str.Length)
                    {
                        --i;
                    }
                }
                break;
                }
            }
            if (OBJ_SIGN != 0 || ARR_SIGN != 0)
            {
                throw new FormatException("The string format is incorrect.");
            }
            result.Add(new JsonToken(null, JsonTokenType.END_DOCUMENT));
            return(result);
        }
예제 #3
0
        public static JsonObject Parser(JsonTokenList tokenList)
        {
            bool           mode       = true;
            JsonObject     result     = new JsonObject();
            JsonObjectItem objectItem = new JsonObjectItem();

            for (int i = 1; i < tokenList.Count() - 1; ++i)
            {
                switch (tokenList[i].Type)
                {
                case JsonTokenType.COLON:
                    mode = true;
                    result.Add(objectItem);
                    objectItem = new JsonObjectItem();
                    break;

                case JsonTokenType.COMMA:
                    mode = false;
                    break;

                case JsonTokenType.STRING:
                    if (mode)
                    {
                        objectItem.Name = tokenList[i].Value;
                    }
                    else
                    {
                        objectItem.Value = new JsonValue(tokenList[i].Value, JsonValueType.STRING);
                    }
                    break;

                case JsonTokenType.NUMBER:
                    objectItem.Value = new JsonValue(double.Parse(tokenList[i].Value), JsonValueType.NUMBER);
                    break;

                case JsonTokenType.BOOLEAN:
                    objectItem.Value = new JsonValue(bool.Parse(tokenList[i].Value), JsonValueType.BOOLEAN);
                    break;

                case JsonTokenType.NULL:
                    objectItem.Value = new JsonValue(null, JsonValueType.NULL);
                    break;

                case JsonTokenType.START_OBJECT:
                {
                    JsonTokenList JsonObj = new JsonTokenList();
                    while (i < tokenList.Count())
                    {
                        JsonObj.Add(tokenList[i]);
                        if (tokenList[i].Type == JsonTokenType.END_OBJECT)
                        {
                            break;
                        }
                        ++i;
                    }
                    objectItem.Value = new JsonValue(JsonObject.Parser(JsonObj), JsonValueType.OBJECT);
                }
                break;

                case JsonTokenType.START_ARRAY:
                {
                    JsonTokenList JsonArr = new JsonTokenList();
                    while (i < tokenList.Count())
                    {
                        JsonArr.Add(tokenList[i]);
                        if (tokenList[i].Type == JsonTokenType.END_ARRAY)
                        {
                            break;
                        }
                        ++i;
                    }
                    objectItem.Value = new JsonValue(JsonArray.Parser(JsonArr), JsonValueType.ARRAY);
                }
                break;
                }
            }
            result.Add(objectItem);
            return(result);
        }