internal static JArray Parse(CharReader reader) { // Purpose: Convert a partial string into a JArray // Author : Scott Bakker // Created: 09/13/2019 // LastMod: 08/11/2020 if (reader == null || reader.Peek() == -1) { return(null); } JArray result = new JArray(); JsonRoutines.SkipBOM(reader); JsonRoutines.SkipWhitespace(reader); if (reader.Peek() != '[') { throw new SystemException( $"JSON Error: Unexpected token to start JArray: {reader.Peek()}"); } reader.Read(); do { JsonRoutines.SkipWhitespace(reader); // check for symbols if (reader.Peek() == ']') { reader.Read(); break; // done building JArray } if (reader.Peek() == ',') { // this logic ignores extra commas, but is ok reader.Read(); continue; // next value } if (reader.Peek() == '{') // JObject { JObject jo = JObject.Parse(reader); result.Add(jo); continue; } if (reader.Peek() == '[') // JArray { JArray ja = JArray.Parse(reader); result.Add(ja); continue; } // Get value as a string, convert to object string tempValue = JsonRoutines.GetToken(reader); result.Add(JsonRoutines.JsonValueToObject(tempValue)); } while (true); return(result); }
internal static JObject Parse(CharReader reader) { // Purpose: Convert a partial string into a JObject // Author : Scott Bakker // Created: 09/13/2019 // LastMod: 08/11/2020 if (reader == null || reader.Peek() == -1) { return(null); } JObject result = new JObject(); JsonRoutines.SkipBOM(reader); JsonRoutines.SkipWhitespace(reader); if (reader.Peek() != '{') { throw new SystemException( $"JSON Error: Unexpected token to start JObject: {reader.Peek()}"); } reader.Read(); do { JsonRoutines.SkipWhitespace(reader); // check for symbols if (reader.Peek() == '}') { reader.Read(); break; // done building JObject } if (reader.Peek() == ',') { // this logic ignores extra commas, but is ok reader.Read(); continue; // Next key/value } string tempKey = JsonRoutines.GetToken(reader); if (JsonRoutines.IsWhitespaceString(tempKey)) { throw new SystemException(JsonKeyError); } if (tempKey.Length <= 2 || !tempKey.StartsWith("\"") || !tempKey.EndsWith("\"")) { throw new SystemException($"JSON Error: Invalid key format: {tempKey}"); } // Convert to usable key tempKey = JsonRoutines.JsonValueToObject(tempKey).ToString(); if (JsonRoutines.IsWhitespaceString(tempKey.Substring(1, tempKey.Length - 2))) { throw new SystemException(JsonKeyError); } // Check for ":" between key and value JsonRoutines.SkipWhitespace(reader); if (JsonRoutines.GetToken(reader) != ":") { throw new SystemException($"JSON Error: Missing colon: {tempKey}"); } // Get value JsonRoutines.SkipWhitespace(reader); if (reader.Peek() == '{') // JObject { JObject jo = JObject.Parse(reader); result[tempKey] = jo; continue; } if (reader.Peek() == '[') // JArray { JArray ja = JArray.Parse(reader); result[tempKey] = ja; continue; } // Get value as a string, convert to object string tempValue = JsonRoutines.GetToken(reader); result[tempKey] = JsonRoutines.JsonValueToObject(tempValue); } while (true); return(result); }