Пример #1
0
        public static JSONDataItem ReadJSON(string jsonString)
        {
            if (jsonString == null)
            {
                return(new JSONnull());
            }
            JSONTokeniser tokeniser = new JSONTokeniser(jsonString);

            JSONDataItem data = GetJSONDataItem(tokeniser);

            if (data == null)
            {
                return(new JSONDataError("Unknown JSON error.", tokeniser.GetCurrentSectionString()));
            }
            else if (data.dataType == JSONDataType.JSON_ERROR)
            {
                Debug.Print(data.ToString());
            }
            else if (data.dataType != JSONDataType.JSON_OBJECT && data.dataType != JSONDataType.JSON_ARRAY)
            {
                return(new JSONDataError("JSON Document malformed. Root node is not an object or an array", tokeniser.GetCurrentSectionString()));
            }

            return(data);
        }
Пример #2
0
        static JSONDataItem GetJSONArray(JSONTokeniser tokeniser)
        {
            JSONArray    jsonArray = new JSONArray();;
            JSONDataItem data;

            // Check for empty array
            data = JSONData.GetJSONDataItem(tokeniser);
            if ((data.dataType == JSONDataType.JSON_NON_DATA) && ((JSONNonData)data).value.tokenType == JSONToken.TOKEN_CLOSE_SQUARE)
            {
                return(jsonArray);
            }

            while (true)
            {
                if (data.dataType == JSONDataType.JSON_NON_DATA)
                {
                    return(new JSONDataError("Expected data value, got " + data, tokeniser.GetCurrentSectionString()));
                }
                else if (data.dataType == JSONDataType.JSON_ERROR)
                {
                    return(data);
                }
                jsonArray.AddItem(data);

                data = JSONData.GetJSONDataItem(tokeniser);

                if (data.dataType == JSONDataType.JSON_NON_DATA)
                {
                    JSONToken token = ((JSONNonData)data).value;
                    if (token.tokenType == JSONToken.TOKEN_COMMA)
                    {
                        data = JSONData.GetJSONDataItem(tokeniser);
                        continue;
                    }
                    else if (token.tokenType == JSONToken.TOKEN_CLOSE_SQUARE)
                    {
                        break; //End of Array
                    }
                    else
                    {
                        return(new JSONDataError("Expected ',' or '], got " + token, tokeniser.GetCurrentSectionString()));
                    }
                }
                else
                {
                    return(new JSONDataError("Expected ',' or '], got " + data, tokeniser.GetCurrentSectionString()));
                }
            }

            return(jsonArray);
        }
Пример #3
0
        public static JSONDataItem GetJSONDataItem(JSONTokeniser tokeniser)
        {
            JSONToken token = tokeniser.NextToken();

            //Print token
            switch (token.tokenType)
            {
            case JSONToken.TOKEN_OPEN_CURLY:
                return(GetJSONObject(tokeniser));

            case JSONToken.TOKEN_OPEN_SQUARE:
                return(GetJSONArray(tokeniser));

            //Boxing
            case JSONToken.TOKEN_STRING:
                return(new JSONString((string)(token.value), false));

            case JSONToken.TOKEN_FLOAT:
                return(new JSONFloat((float)token.value));

            case JSONToken.TOKEN_UNPARSED_FLOAT:
                return(new JSONFloat(token.value.ToString()));

            case JSONToken.TOKEN_INTEGER:
                return(new JSONInteger((int)token.value));

            case JSONToken.TOKEN_TRUE:
                return(new JSONBool(true));

            case JSONToken.TOKEN_FALSE:
                return(new JSONBool(false));

            case JSONToken.TOKEN_NULL:
                return(new JSONnull());

            default:
                return(new JSONNonData(token));
            }
        }
Пример #4
0
        static JSONDataItem GetJSONObject(JSONTokeniser tokeniser)
        {
            JSONObject   jsonObject = new JSONObject();
            JSONDataItem data1;
            JSONDataItem data2;

            //Check if this is an empty definition
            data1 = JSONData.GetJSONDataItem(tokeniser);
            if (data1.dataType == JSONDataType.JSON_NON_DATA && ((JSONNonData)data1).value.tokenType == JSONToken.TOKEN_CLOSE_CURLY)
            {
                //End of object
                return(jsonObject);
            }

            while (true)
            {
                if (data1.dataType != JSONDataType.JSON_STRING)
                {
                    return(new JSONDataError("Expected item name, got " + data1, tokeniser.GetCurrentSectionString()));
                }

                data2 = JSONData.GetJSONDataItem(tokeniser);

                if (data2.dataType != JSONDataType.JSON_NON_DATA)
                {
                    return(new JSONDataError("Expected ':', got " + data2, tokeniser.GetCurrentSectionString()));
                }
                else
                {
                    var d2 = (JSONNonData)data2;
                    if (d2.value.tokenType != JSONToken.TOKEN_COLON)
                    {
                        return(new JSONDataError("Expected ':', got " + d2.value, tokeniser.GetCurrentSectionString()));
                    }
                }

                data2 = JSONData.GetJSONDataItem(tokeniser);

                if (data2.dataType == JSONDataType.JSON_ERROR)
                {
                    return(data2);
                }
                else if (data2.dataType == JSONDataType.JSON_NON_DATA)
                {
                    return(new JSONDataError("Expected item value, got " + ((JSONNonData)data2).value, tokeniser.GetCurrentSectionString()));
                }

                jsonObject.AddItem(((JSONString)data1).value, data2);
                data2 = JSONData.GetJSONDataItem(tokeniser);

                if (data2.dataType != JSONDataType.JSON_NON_DATA)
                {
                    return(new JSONDataError("Expected ',' or '}', got " + data2, tokeniser.GetCurrentSectionString()));
                }
                else
                {
                    if (((JSONNonData)data2).value.tokenType == JSONToken.TOKEN_CLOSE_CURLY)
                    {
                        break; //End of Object
                    }
                    else if (((JSONNonData)data2).value.tokenType != JSONToken.TOKEN_COMMA)
                    {
                        return(new JSONDataError("Expected ',' or '}', got " + ((JSONNonData)data2).value, tokeniser.GetCurrentSectionString()));
                    }
                }
                data1 = JSONData.GetJSONDataItem(tokeniser);
            }

            return(jsonObject);
        }