private void SerializeObject(JsonWriter writer, object value) { Type objectType = value.GetType(); TypeConverter converter = TypeDescriptor.GetConverter(objectType); // use the objectType's TypeConverter if it has one and can convert to a string if (converter != null && !(converter is ComponentConverter) && converter.GetType() != typeof(TypeConverter)) { if (converter.CanConvertTo(typeof(string))) { writer.WriteValue(converter.ConvertToInvariantString(value)); return; } } writer.SerializeStack.Add(value); writer.WriteStartObject(); MemberMappingCollection memberMappings = GetMemberMappings(objectType); foreach (MemberMapping memberMapping in memberMappings) { if (!memberMapping.Ignored && memberMapping.Readable) WriteMemberInfoProperty(writer, value, memberMapping.Member, memberMapping.MappingName); } writer.WriteEndObject(); writer.SerializeStack.Remove(value); }
private void SerializeValue(JsonWriter writer, object value) { JsonConverter converter; if (value == null) { writer.WriteNull(); } else if (HasMatchingConverter(value.GetType(), out converter)) { converter.WriteJson(writer, value); } else if (value is IConvertible) { IConvertible convertible = value as IConvertible; switch (convertible.GetTypeCode()) { case TypeCode.String: writer.WriteValue((string)convertible); break; case TypeCode.Char: writer.WriteValue((char)convertible); break; case TypeCode.Boolean: writer.WriteValue((bool)convertible); break; case TypeCode.SByte: writer.WriteValue((sbyte)convertible); break; case TypeCode.Int16: writer.WriteValue((short)convertible); break; case TypeCode.UInt16: writer.WriteValue((ushort)convertible); break; case TypeCode.Int32: writer.WriteValue((int)convertible); break; case TypeCode.Byte: writer.WriteValue((byte)convertible); break; case TypeCode.UInt32: writer.WriteValue((uint)convertible); break; case TypeCode.Int64: writer.WriteValue((long)convertible); break; case TypeCode.UInt64: writer.WriteValue((ulong)convertible); break; case TypeCode.Single: writer.WriteValue((float)convertible); break; case TypeCode.Double: writer.WriteValue((double)convertible); break; case TypeCode.DateTime: writer.WriteValue((DateTime)convertible); break; case TypeCode.Decimal: writer.WriteValue((decimal)convertible); break; default: SerializeObject(writer, value); break; } } else if (value is IList) { SerializeList(writer, (IList)value); } else if (value is IDictionary) { SerializeDictionary(writer, (IDictionary)value); } else if (value is ICollection) { SerializeCollection(writer, (ICollection)value); } else if (value is Identifier) { writer.WriteRaw(value.ToString()); } else { SerializeObject(writer, value); } }