Пример #1
0
 private void WriteFieldName(VisitArgs args)
 {
     WriteEscaped(_fieldNameResolver.Resolve(args));
 }
Пример #2
0
        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));
        }