private JsonValue ParseObject(ICharReader charReader) { var members = new List <JsonObjectMember>(); if (!charReader.TrimRead('{')) { throw new JsonException("Expected '{' when parsing json object."); } var peek = charReader.TrimThenPeek(); if (!peek.HasValue) { throw new JsonException("Unterminated object"); } while (peek.Value != '}') { if (members.Any()) { if (!charReader.TrimRead(',')) { throw new JsonException("Missing comma separater between array items."); } } members.Add(ParseObjectMember(charReader)); peek = charReader.TrimThenPeek(); if (!peek.HasValue) { throw new JsonException("Unterminated object"); } } charReader.Read(); // } return(new JsonObject(members)); }
private JsonValue ParseArray(ICharReader charReader) { charReader.TrimRead(); // [ var items = new List <JsonValue>(); while (charReader.TrimThenPeek() != ']') { if (items.Any()) { if (!charReader.TrimRead(',')) { throw new JsonException("Missing comma separater between array items."); } } items.Add(ParseJsonValue(charReader)); } charReader.Read(); // ] return(new JsonArray(items)); }
private JsonObjectMember ParseObjectMember(ICharReader charReader) { var name = ParseString(charReader); if (!charReader.TrimRead(':')) { throw new JsonException("expected ':' after member name."); } var value = ParseJsonValue(charReader); return(new JsonObjectMember(name.Value, value)); }
private JsonString ParseString(ICharReader charReader) { var delimiter = charReader.TrimRead(); if (delimiter != '\'' && delimiter != '"') { throw new JsonException("Strings must be delimiated with either single or double quotes"); } var sb = new StringBuilder(); var c = GetNextStringCharacter(charReader, delimiter); while (c.HasValue) { sb.Append(c); c = GetNextStringCharacter(charReader, delimiter); } return(new JsonString(sb.ToString())); }