示例#1
0
            public void PropertyName(string propertyName)
            {
                if (propertyName.Equals(mParent.mTypeProperty, StringComparison.OrdinalIgnoreCase))
                {
                    if (mWrappedConsumer != null)
                    {
                        throw new Exception($"The property '{mParent.mTypeProperty}' must only appear once in the JSON object when deserializing type '{mBaseType}'.");
                    }

                    return;
                }
                else
                {
                    if (mWrappedConsumer == null)
                    {
                        if (mParent.mTypeNameResolver.DefaultType == null)
                        {
                            throw new Exception($"The property '{mParent.mTypeProperty}' must be the first property in the JSON object when deserializing type '{mBaseType}'.");
                        }

                        mWrappedConsumer = mParent.GetConverterForType(mParent.mTypeNameResolver.DefaultType).FromObject(mWhenDone);
                    }
                }

                mWrappedConsumer.PropertyName(propertyName);
            }
示例#2
0
            public static void ParseObject(Tokenizer tokenizer, IJsonObjectConsumer consumer)
            {
                tokenizer.MoveNext(); // skip '{'
                if (tokenizer.CurrentToken.Type == Tokenizer.Token.CurlyClose)
                {
                    tokenizer.MoveNext(); // skip '}'
                    consumer.Done();
                    return;
                }

                for (; ;)
                {
                    if (tokenizer.CurrentToken.Type == Tokenizer.Token.None)
                    {
                        throw new ParserException($"Unexpected end of stream reached while parsing object in line {tokenizer.CurrentToken.LineNo} at position {tokenizer.CurrentToken.Position}.", tokenizer.CurrentToken.LineNo, tokenizer.CurrentToken.Position);
                    }

                    if (tokenizer.CurrentToken.Type != Tokenizer.Token.String)
                    {
                        throw new ParserException($"Unexpected token in line {tokenizer.CurrentToken.LineNo} at position {tokenizer.CurrentToken.Position}. Property name was expected.", tokenizer.CurrentToken.LineNo, tokenizer.CurrentToken.Position);
                    }

                    // expect string literal
                    consumer.PropertyName(tokenizer.CurrentToken.StringValue);

                    // expect ':'
                    tokenizer.MoveNext();
                    if (tokenizer.CurrentToken.Type == Tokenizer.Token.None)
                    {
                        throw new ParserException($"Unexpected end of stream reached while parsing object in line {tokenizer.CurrentToken.LineNo} at position {tokenizer.CurrentToken.Position}.", tokenizer.CurrentToken.LineNo, tokenizer.CurrentToken.Position);
                    }
                    if (tokenizer.CurrentToken.Type != Tokenizer.Token.Colon)
                    {
                        throw new ParserException($"Unexpected token in line {tokenizer.CurrentToken.LineNo} at position {tokenizer.CurrentToken.Position}. ':' was expected.", tokenizer.CurrentToken.LineNo, tokenizer.CurrentToken.Position);
                    }

                    // parse value
                    tokenizer.MoveNext(); // skip ':'
                    ParseValue(tokenizer, consumer);

                    if (tokenizer.CurrentToken.Type == Tokenizer.Token.None)
                    {
                        throw new ParserException($"Unexpected end of stream reached while parsing object in line {tokenizer.CurrentToken.LineNo} at position {tokenizer.CurrentToken.Position}.", tokenizer.CurrentToken.LineNo, tokenizer.CurrentToken.Position);
                    }
                    if (tokenizer.CurrentToken.Type == Tokenizer.Token.CurlyClose)
                    {
                        tokenizer.MoveNext(); // skip '}'
                        consumer.Done();
                        return;
                    }
                    if (tokenizer.CurrentToken.Type != Tokenizer.Token.Comma)
                    {
                        throw new ParserException($"Unexpected token in line {tokenizer.CurrentToken.LineNo} at position {tokenizer.CurrentToken.Position}. Either '}}' or ',' was expected.", tokenizer.CurrentToken.LineNo, tokenizer.CurrentToken.Position);
                    }

                    tokenizer.MoveNext(); // skip ','
                }
            }
示例#3
0
        /// <summary>
        /// Writes this <see cref="JsonObject"/> 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)
        {
            IJsonObjectConsumer obj = consumer.Object();

            foreach (KeyValuePair <string, JsonValue> property in mPropertiesOrdered)
            {
                obj.PropertyName(property.Key);
                property.Value.Write(obj);
            }
            obj.Done();
        }
示例#4
0
            public IJsonObjectConsumer Object()
            {
                IJsonObjectConsumer obj = mWrappedConsumer.Object();

                if (mTypeName != null)
                {
                    obj.PropertyName(mTypeProperty);
                    obj.String(mTypeName);
                }
                return(obj);
            }
示例#5
0
            public void String(string value)
            {
                if (mWrappedConsumer == null)
                {
                    if (!mParent.mTypeNameResolver.TryGetType(value, out Type type))
                    {
                        throw new Exception($"Type name '{value}' is unknown while deserializing type '{mBaseType}'.");
                    }

                    mWrappedConsumer = mParent.GetConverterForType(type).FromObject(mWhenDone);
                }
                mWrappedConsumer.String(value);
            }
示例#6
0
        public override void Write(object value, IJsonConsumer writer)
        {
            if (value == null)
            {
                writer.Null();
                return;
            }

            IJsonObjectConsumer objectConsumer = writer.Object();

            foreach (KeyValuePair <string, T> kvp in (Dictionary <string, T>)value)
            {
                objectConsumer.PropertyName(kvp.Key);
                ElementConverter.Write(kvp.Value, objectConsumer);
            }
            objectConsumer.Done();
        }