static JsonArray ParseArray(ReadControl control) { JsonArray array = new JsonArray(); JsonElement currentValue = null; bool valueAdded = false; while (control.Read() != ']') { if (ParserLookup.TryGetValue(control.CurrentCharacter, out Func <ReadControl, JsonElement> parser)) { currentValue = parser.Invoke(control); } else { switch (control.CurrentCharacter) { case '\0': throw new UnexpectedEndException(); case ':': throw new UnexpectedTokenException(); case ',': if (!valueAdded) { throw new UnexpectedTokenException(); } valueAdded = false; break; default: if (CanParseNumber(control.CurrentCharacter)) { currentValue = ParseNumber(control); } break; } } if (currentValue != null) { array.Add(currentValue); currentValue = null; valueAdded = true; } } return(array); }
static JsonObject ParseObject(ReadControl control) { var obj = new JsonObject(); JsonString currentKey = null; JsonElement currentValue = null; bool pairAdded = false; while (control.Read() != '}') { if (ParserLookup.TryGetValue(control.CurrentCharacter, out Func <ReadControl, JsonElement> parser)) { currentValue = parser.Invoke(control); } else { switch (control.CurrentCharacter) { case '\0': throw new UnexpectedEndException(); case ':': if (currentKey == null) { throw new UnexpectedTokenException(); } break; case ',': if (!pairAdded) { throw new UnexpectedTokenException(); } pairAdded = false; break; default: if (CanParseNumber(control.CurrentCharacter)) { currentValue = ParseNumber(control); } break; } } if (currentValue != null) { if (currentKey == null) { currentKey = currentValue as JsonString ?? throw new InvalidKeyException(); } else { if (obj.ContainsKey(currentKey)) { switch (control.Options.DuplicateKeyBehaviour) { case DuplicateKeyBehaviour.Overwrite: obj[currentKey] = currentValue; break; case DuplicateKeyBehaviour.Ignore: // We do nothing, as the value for the key will remain unchanged. break; case DuplicateKeyBehaviour.ThrowException: default: throw new DuplicateKeyException(currentKey); } } else { obj.Add(currentKey, currentValue); } currentKey = null; pairAdded = true; } currentValue = null; } } return(obj); }