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); }
public static JSONDataItem ReadJSON(string jsonString) { 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); }
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)); } }
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); }