示例#1
0
        /// <summary>
        /// Writes this <see cref="JsonArray"/> to a <see cref="IJsonConsumer"/>.
        /// This is also used internally by <see cref="JsonValue.ToModel(System.Type)"/> and
        /// <see cref="JsonValue.ToModel{T}"/> in order to convert this generic object
        /// model to a JSON string or another .NET object.
        /// </summary>
        /// <param name="consumer">The consumer.</param>
        public override void Write(IJsonConsumer consumer)
        {
            IJsonArrayConsumer arrayConsumer = consumer.Array();

            for (int i = 0; i < mList.Count; i++)
            {
                mList[i].Write(arrayConsumer);
            }
            arrayConsumer.Done();
        }
示例#2
0
            public static void ParseValue(Tokenizer tokenizer, IJsonConsumer consumer)
            {
                if (tokenizer.CurrentToken.Type == Tokenizer.Token.None)
                {
                    throw new ParserException($"Unexpected end of stream reached in line {tokenizer.CurrentToken.LineNo} at position {tokenizer.CurrentToken.Position}.", tokenizer.CurrentToken.LineNo, tokenizer.CurrentToken.Position);
                }

                if (tokenizer.CurrentToken.Type == Tokenizer.Token.CurlyOpen)
                {
                    ParseObject(tokenizer, consumer.Object());
                    return;
                }
                if (tokenizer.CurrentToken.Type == Tokenizer.Token.SquaredOpen)
                {
                    ParseArray(tokenizer, consumer.Array());
                    return;
                }

                if (tokenizer.CurrentToken.Type == Tokenizer.Token.String)
                {
                    consumer.String(tokenizer.CurrentToken.StringValue);
                }
                else if (tokenizer.CurrentToken.Type == Tokenizer.Token.Boolean)
                {
                    consumer.Boolean(tokenizer.CurrentToken.BooleanValue);
                }
                else if (tokenizer.CurrentToken.Type == Tokenizer.Token.NumberInteger)
                {
                    consumer.Number(tokenizer.CurrentToken.IntegerValue);
                }
                else if (tokenizer.CurrentToken.Type == Tokenizer.Token.NumberUnsignedInteger)
                {
                    consumer.Number(tokenizer.CurrentToken.UnsignedIntegerValue);
                }
                else if (tokenizer.CurrentToken.Type == Tokenizer.Token.NumberFloat)
                {
                    consumer.Number(tokenizer.CurrentToken.FloatValue);
                }
                else if (tokenizer.CurrentToken.Type == Tokenizer.Token.Null)
                {
                    consumer.Null();
                }
                else
                {
                    throw new ParserException($"Expected value in line {tokenizer.CurrentToken.LineNo} at position {tokenizer.CurrentToken.Position}, but found '{tokenizer.CurrentToken}'.", tokenizer.CurrentToken.LineNo, tokenizer.CurrentToken.Position);
                }

                tokenizer.MoveNext(); // skip value literal
            }
示例#3
0
        /// <summary>
        /// Writes data of the .NET object to the given <see cref="IJsonConsumer"/>
        /// in order to convert it to a JSON string or to any other representation of
        /// JSON data. This implementation expects <paramref name="value"/> to implement
        /// <see cref="IEnumerable"/> and creates a JSON array from it. The <paramref name="value"/>
        /// may be null, though.
        /// </summary>
        /// <param name="value">The .NET object to write. It may be null or an instance of
        /// <see cref="IEnumerable"/>.</param>
        /// <param name="writer">The JSON consumer which will be used to write the array to.</param>
        public override void Write(object value, IJsonConsumer writer)
        {
            if (value == null)
            {
                writer.Null();
                return;
            }

            var arrayConsumer = writer.Array();

            foreach (object item in (IEnumerable)value)
            {
                ElementConverter.Write(item, arrayConsumer);
            }
            arrayConsumer.Done();
        }