Example #1
0
        public override void Write(object value, IJsonConsumer writer)
        {
            if (value == null)
            {
                writer.Null();
                return;
            }

            var objConsumer = writer.Object();

            foreach (var property in mPropList)
            {
                object propValue = property.Getter(value);
                if (propValue == null)
                {
                    if (!property.EmitNullValue)
                    {
                        continue;
                    }
                }
                else if (property.SuppressDefaultValue && Equals(propValue, property.DefaultValue))
                {
                    continue;
                }

                objConsumer.PropertyName(property.Name);
                property.Converter.Write(propValue, objConsumer);
            }

            objConsumer.Done();
        }
Example #2
0
 public WritingConsumer(string typeName, string typeProperty, Type type, IJsonConsumer wrappedConsumer)
 {
     this.mTypeName        = typeName;
     this.mTypeProperty    = typeProperty;
     this.mType            = type;
     this.mWrappedConsumer = wrappedConsumer;
 }
Example #3
0
 public override void Write(object value, IJsonConsumer writer)
 {
     if (!mEnumValueToString.TryGetValue(value, out string str))
     {
         throw new Exception($"Unrecognized enumeration value '{value}'. Valid values are {string.Join(", ", mStringToEnumValue.Keys)}.");
     }
     writer.String(str);
 }
Example #4
0
        protected override void InternalWrite(DateTime value, IJsonConsumer writer)
        {
            StringBuilder sb = new StringBuilder(50);

            if (value.Year < 10)
            {
                sb.Append("000");
            }
            else if (value.Year < 100)
            {
                sb.Append("00");
            }
            else if (value.Year < 1000)
            {
                sb.Append('0');
            }
            sb.Append(value.Year);

            sb.Append('-');
            Append2Chars(sb, value.Month);
            sb.Append('-');
            Append2Chars(sb, value.Day);
            sb.Append('T');
            Append2Chars(sb, value.Hour);
            sb.Append(':');
            Append2Chars(sb, value.Minute);
            sb.Append(':');
            Append2Chars(sb, value.Second);

            if (value.Millisecond > 0)
            {
                sb.Append('.');
                Append3Chars(sb, value.Millisecond);
            }

            if (value.Kind == DateTimeKind.Utc)
            {
                sb.Append('Z');
            }
            else if (value.Kind == DateTimeKind.Local)
            {
                TimeSpan offset = TimeZoneInfo.Local.GetUtcOffset(value);
                if (offset >= TimeSpan.Zero)
                {
                    sb.Append('+');
                }
                else
                {
                    sb.Append('-');
                    offset = offset.Negate();
                }
                Append2Chars(sb, offset.Hours);
                sb.Append(':');
                Append2Chars(sb, offset.Minutes);
            }
            writer.String(sb.ToString());
        }
        /// <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.
        /// </summary>
        /// <param name="value">The .NET object to write. The object type must match
        /// the type of the converter.</param>
        /// <param name="writer">The JSON consumer which will be used to write
        /// the data to according to the contents of the given value.</param>
        public sealed override void Write(object value, IJsonConsumer writer)
        {
            if (mNullable && value == null)
            {
                writer.Null();
                return;
            }

            InternalWrite((T)value, writer);
        }
Example #6
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();
        }
            public override void Write(object value, IJsonConsumer writer)
            {
                if (value == null)
                {
                    writer.Null();
                    return;
                }

                valueTypeConverter.Write(value, writer);
            }
 public override void Write(object value, IJsonConsumer writer)
 {
     if (value == null)
     {
         writer.Null();
     }
     else
     {
         writer.String(System.Convert.ToBase64String((byte[])value, System.Base64FormattingOptions.None));
     }
 }
Example #9
0
 /// <summary>
 /// Writes the string or null value to the <see cref="IJsonConsumer"/>.
 /// </summary>
 /// <param name="value">The string value or null.</param>
 /// <param name="writer">The <see cref="IJsonConsumer"/></param>
 public override void Write(object value, IJsonConsumer writer)
 {
     if (value == null)
     {
         writer.Null();
     }
     else
     {
         writer.String((string)value);
     }
 }
Example #10
0
 /// <summary>
 /// Serializes the given object into the given consumer.
 /// </summary>
 /// <param name="model">The object to serialize. This may be null or a primitive.</param>
 /// <param name="consumer">An instance of IJsonConsumer which receives all data from
 /// the given object.</param>
 public static void Write(object model, IJsonConsumer consumer)
 {
     if (model == null)
     {
         consumer.Null();
     }
     else
     {
         ConverterRegistry.Get(model.GetType()).Write(model, consumer);
     }
 }
Example #11
0
 protected override void InternalWrite(long value, IJsonConsumer writer)
 {
     if (value >= 0)
     {
         writer.Number((ulong)value);
     }
     else
     {
         writer.Number(value);
     }
 }
Example #12
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();
        }
Example #13
0
        /// <summary>
        /// Parses JSON read from the given text reader and pushes all
        /// data into the given consumer.
        /// </summary>
        /// <param name="reader">The TextReader to read JSON from.</param>
        /// <param name="consumer">The consumer which will be invoked for the
        /// parsed fragments.</param>
        public static void Parse(TextReader reader, IJsonConsumer consumer)
        {
            var tokenizer = new Tokenizer(reader);

            tokenizer.MoveNext();
            Parser.ParseValue(tokenizer, consumer);

            if (tokenizer.CurrentToken.Type != Tokenizer.Token.None)
            {
                throw new ParserException($"Unexpected input data '{tokenizer.CurrentToken}' after end of JSON entity in line {tokenizer.CurrentToken.LineNo} at position {tokenizer.CurrentToken.Position}.", tokenizer.CurrentToken.LineNo, tokenizer.CurrentToken.Position);
            }
        }
Example #14
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
            }
Example #15
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();
        }
Example #16
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();
        }
Example #17
0
 protected override void InternalWrite(double value, IJsonConsumer writer)
 {
     if (double.IsNaN(value))
     {
         writer.String(NAN);
     }
     else if (double.IsPositiveInfinity(value))
     {
         writer.String(POS_INFINITY);
     }
     else if (double.IsNegativeInfinity(value))
     {
         writer.String(NEG_INFINITY);
     }
     else
     {
         writer.Number(value);
     }
 }
Example #18
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.
        /// </summary>
        /// <param name="value">The .NET object to write. Implementors may assume
        /// that the type of the incoming value can be cast to the target type
        /// of this converter, however, it may be null.</param>
        /// <param name="writer">The JSON consumer which must be used to write
        /// the data to according to the contents of the given value.</param>
        public override void Write(object value, IJsonConsumer writer)
        {
            if (value == null)
            {
                writer.Null();
                return;
            }

            Type type = value.GetType();

            if (!mTypeNameResolver.TryGetTypeName(type, out string typeName) && type != mTypeNameResolver.DefaultType)
            {
                throw new Exception($"Type '{type}' is unknown.");
            }

            IConverter converter = GetConverterForType(type);

            converter.Write(value, new WritingConsumer(typeName, mTypeProperty, type, writer));
        }
Example #19
0
 protected override void InternalWrite(float value, IJsonConsumer writer)
 {
     if (float.IsNaN(value))
     {
         writer.String(DoubleConverter.NAN);
     }
     else if (float.IsPositiveInfinity(value))
     {
         writer.String(DoubleConverter.POS_INFINITY);
     }
     else if (float.IsNegativeInfinity(value))
     {
         writer.String(DoubleConverter.NEG_INFINITY);
     }
     else
     {
         writer.Number((double)value);
     }
 }
Example #20
0
 public override void Write(object value, IJsonConsumer writer)
 {
     if (value == null)
     {
         writer.Null();
     }
     else
     {
         Type type = value.GetType();
         if (type == typeof(object)) // prevent recursion
         {
             writer.Object().Done();
         }
         else
         {
             IConverter converter = ConverterRegistry.Get(type);
             converter.Write(value, writer);
         }
     }
 }
Example #21
0
 public void Write(object value, IJsonConsumer writer)
 {
     writer.String(((int)value).ToString("X"));
 }
Example #22
0
 /// <summary>
 /// Parses the given JSON and pushes all
 /// data into the given consumer.
 /// </summary>
 /// <param name="json">The JSON to parse.</param>
 /// <param name="consumer">The consumer which will be invoked for the
 /// parsed fragments.</param>
 public static void Parse(string json, IJsonConsumer consumer)
 {
     using (StringReader reader = new StringReader(json))
         Parse(reader, consumer);
 }
Example #23
0
 /// <summary>
 /// Writes this <see cref="JsonValue"/> to a <see cref="IJsonConsumer"/>.
 /// This is also used internally by <see cref="Write(TextWriter, bool)"/>,
 /// <see cref="ToModel(Type)"/> and <see cref="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 abstract void Write(IJsonConsumer consumer);
Example #24
0
 protected override void InternalWrite(Guid value, IJsonConsumer writer)
 {
     writer.String(value.ToString());
 }
Example #25
0
 /// <summary>
 /// Writes this <see cref="JsonBoolean"/> 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)
 {
     consumer.Boolean(Value);
 }
 public override void Write(object value, IJsonConsumer writer)
 {
     ((JsonValue)value).Write(writer);
 }
Example #27
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.
 /// </summary>
 /// <param name="value">The .NET object to write. Implementors may assume
 /// that the type of the incoming value can be cast to the target type
 /// of this converter, however, it may be null.</param>
 /// <param name="writer">The JSON consumer which must be used to write
 /// the data to according to the contents of the given value.</param>
 public abstract void Write(object value, IJsonConsumer writer);
 /// <summary>
 /// An internal Write method which needs to be implemented
 /// by deriving classes. The <paramref name="value"/> is non-nullable
 /// at this point.
 /// </summary>
 /// <param name="value">The value to write.</param>
 /// <param name="writer">The json consumer to write to.</param>
 protected abstract void InternalWrite(T value, IJsonConsumer writer);
Example #29
0
 /// <summary>
 /// Writes null 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)
 {
     consumer.Null();
 }
Example #30
0
 protected override void InternalWrite(uint value, IJsonConsumer writer)
 {
     writer.Number((ulong)value);
 }