private void WriteFieldName(VisitArgs args) { WriteEscaped(_fieldNameResolver.Resolve(args)); }
private IJsonNode ParseUntilFound(VisitArgs args) { var name = string.IsNullOrEmpty(args.Name) ? null : _fieldNameResolver.Resolve(args); JsonLiteral literal; if (args.IsRoot) { // When the value being deserialized is a simple value only literal = _reader.ReadLiteral(); return(_reader.ReadValue(literal)); } var parent = _parents.Peek(); if (args.Type.IsDictionaryKey()) { if (!_reader.ReadFieldName(out var key)) { parent.IsFullyParsed = true; return(JsonUndefined.Instance); } return(new JsonString(key)); } if (args.Type.IsDictionaryValue()) { literal = _reader.ReadLiteral(); if (literal != JsonLiteral.Assignment) { throw UnexpectedJsonException.From("dictionary assignment token", _buffer, _encoding); } literal = _reader.ReadLiteral(); if (literal == JsonLiteral.ObjectBegin) { var child = new JsonObject(); _parents.Push(new JsonReadLevel(child)); return(child); } if (literal == JsonLiteral.ArrayBegin) { _parents.Push(ArrayLevel); return(ArrayLevel.Node); } return(_reader.ReadValue(literal)); } if (parent.Node is JsonObject obj) { if (obj.TryGet(name, out var field)) { if (field is JsonObject || field is JsonArray) { _parents.Push(new JsonReadLevel(field)); } return(field); } if (parent.IsFullyParsed) { return(JsonUndefined.Instance); } while (true) { if (!_reader.ReadFieldName(out var fieldName)) { parent.IsFullyParsed = true; return(JsonUndefined.Instance); } if (string.Equals(fieldName, name, StringComparison.Ordinal)) { if (args.Type == LevelType.Single || args.Type.IsDictionary()) { literal = _reader.ReadLiteral(); if (literal != JsonLiteral.Assignment) { throw UnexpectedJsonException.From("assignment token", _buffer, _encoding); } literal = _reader.ReadLiteral(); if (literal == JsonLiteral.Null) { return(JsonNull.Instance); } if (literal == JsonLiteral.ObjectBegin) { var child = new JsonObject(); _parents.Push(new JsonReadLevel(child)); return(child); } throw UnexpectedJsonException.From("object begin token", _buffer, _encoding); } if (args.Type.IsCollection()) { literal = _reader.ReadLiteral(); if (literal != JsonLiteral.Assignment) { throw UnexpectedJsonException.From("assignment token", _buffer, _encoding); } literal = _reader.ReadLiteral(); if (literal == JsonLiteral.Null) { return(JsonNull.Instance); } if (literal == JsonLiteral.ArrayBegin) { _parents.Push(ArrayLevel); return(ArrayLevel.Node); } throw UnexpectedJsonException.From("array begin token", _buffer, _encoding); } if (!_reader.ReadFieldValue(out var fieldValue)) { throw UnexpectedJsonException.From("field value", _buffer, _encoding); } return(fieldValue); } if (!_reader.ReadFieldValue(out var fieldNode)) { throw UnexpectedJsonException.From("field value", _buffer, _encoding); } obj.Add(fieldName, fieldNode); } } literal = _reader.ReadLiteral(); if (literal == JsonLiteral.Comma) { literal = _reader.ReadLiteral(); } if (args.Type == LevelType.Collection) { if (literal == JsonLiteral.ArrayBegin) { _parents.Push(ArrayLevel); return(ArrayLevel.Node); } throw UnexpectedJsonException.From("array begin token", _buffer, _encoding); } if (literal == JsonLiteral.ObjectBegin) { var child = new JsonObject(); _parents.Push(new JsonReadLevel(child)); return(child); } if (literal == JsonLiteral.ArrayEnd) { return(JsonUndefined.Instance); } return(_reader.ReadValue(literal)); }