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); }
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); }
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); }