From b71e17cc42a9d43eeb3930c6b0a81aacfc70e21f Mon Sep 17 00:00:00 2001 From: James Newton-King Date: Sun, 10 Feb 2013 12:53:03 +1300 Subject: [PATCH] -Refectored WriteValue(object) --- .../Properties/AssemblyInfo.cs | 2 +- Src/Newtonsoft.Json/JsonWriter.cs | 192 +++++++----------- .../Properties/AssemblyInfo.cs | 2 +- 3 files changed, 79 insertions(+), 117 deletions(-) diff --git a/Src/Newtonsoft.Json.Tests/Properties/AssemblyInfo.cs b/Src/Newtonsoft.Json.Tests/Properties/AssemblyInfo.cs index be1abd51..2088f356 100644 --- a/Src/Newtonsoft.Json.Tests/Properties/AssemblyInfo.cs +++ b/Src/Newtonsoft.Json.Tests/Properties/AssemblyInfo.cs @@ -76,5 +76,5 @@ using System.Security; // by using the '*' as shown below: [assembly: AssemblyVersion("4.5.0.0")] #if !PocketPC -[assembly: AssemblyFileVersion("4.5.11.15809")] +[assembly: AssemblyFileVersion("4.5.11.15810")] #endif diff --git a/Src/Newtonsoft.Json/JsonWriter.cs b/Src/Newtonsoft.Json/JsonWriter.cs index d4c1fcca..9b494ebb 100644 --- a/Src/Newtonsoft.Json/JsonWriter.cs +++ b/Src/Newtonsoft.Json/JsonWriter.cs @@ -1219,98 +1219,7 @@ namespace Newtonsoft.Json /// The value to write. public virtual void WriteValue(object value) { - if (value == null) - { - WriteNull(); - return; - } - else if (ConvertUtils.IsConvertible(value)) - { - IConvertible convertible = ConvertUtils.ToConvertible(value); - - switch (convertible.GetTypeCode()) - { - case TypeCode.String: - WriteValue(convertible.ToString(CultureInfo.InvariantCulture)); - return; - case TypeCode.Char: - WriteValue(convertible.ToChar(CultureInfo.InvariantCulture)); - return; - case TypeCode.Boolean: - WriteValue(convertible.ToBoolean(CultureInfo.InvariantCulture)); - return; - case TypeCode.SByte: - WriteValue(convertible.ToSByte(CultureInfo.InvariantCulture)); - return; - case TypeCode.Int16: - WriteValue(convertible.ToInt16(CultureInfo.InvariantCulture)); - return; - case TypeCode.UInt16: - WriteValue(convertible.ToUInt16(CultureInfo.InvariantCulture)); - return; - case TypeCode.Int32: - WriteValue(convertible.ToInt32(CultureInfo.InvariantCulture)); - return; - case TypeCode.Byte: - WriteValue(convertible.ToByte(CultureInfo.InvariantCulture)); - return; - case TypeCode.UInt32: - WriteValue(convertible.ToUInt32(CultureInfo.InvariantCulture)); - return; - case TypeCode.Int64: - WriteValue(convertible.ToInt64(CultureInfo.InvariantCulture)); - return; - case TypeCode.UInt64: - WriteValue(convertible.ToUInt64(CultureInfo.InvariantCulture)); - return; - case TypeCode.Single: - WriteValue(convertible.ToSingle(CultureInfo.InvariantCulture)); - return; - case TypeCode.Double: - WriteValue(convertible.ToDouble(CultureInfo.InvariantCulture)); - return; - case TypeCode.DateTime: - WriteValue(convertible.ToDateTime(CultureInfo.InvariantCulture)); - return; - case TypeCode.Decimal: - WriteValue(convertible.ToDecimal(CultureInfo.InvariantCulture)); - return; -#if !(NETFX_CORE || PORTABLE) - case TypeCode.DBNull: - WriteNull(); - return; -#endif - } - } -#if !PocketPC && !NET20 - else if (value is DateTimeOffset) - { - WriteValue((DateTimeOffset)value); - return; - } -#endif - else if (value is byte[]) - { - WriteValue((byte[])value); - return; - } - else if (value is Guid) - { - WriteValue((Guid)value); - return; - } - else if (value is Uri) - { - WriteValue((Uri)value); - return; - } - else if (value is TimeSpan) - { - WriteValue((TimeSpan)value); - return; - } - - throw JsonWriterException.Create(this, "Unsupported type: {0}. Use the JsonSerializer class to get the object's JSON representation.".FormatWith(CultureInfo.InvariantCulture, value.GetType()), null); + WriteValueInternal(value, false); } /// @@ -1321,64 +1230,108 @@ namespace Newtonsoft.Json /// A flag indicating whether the value is nullable. public virtual void WriteValue(object value, bool nullable) { - if (!nullable) - WriteValue(value); + WriteValueInternal(value, nullable); + } + private void WriteValueInternal(object value, bool nullable) + { if (value == null) { WriteNull(); return; } - else if (ConvertUtils.IsConvertible(value)) - { - IConvertible convertible = ConvertUtils.ToConvertible(value); + IConvertible convertible = ConvertUtils.ToConvertible(value); + if (convertible != null) + { switch (convertible.GetTypeCode()) { case TypeCode.String: WriteValue(convertible.ToString(CultureInfo.InvariantCulture)); return; case TypeCode.Char: - WriteValue((char?)convertible.ToChar(CultureInfo.InvariantCulture)); + if (nullable) + WriteValue((char?)convertible.ToChar(CultureInfo.InvariantCulture)); + else + WriteValue(convertible.ToChar(CultureInfo.InvariantCulture)); return; case TypeCode.Boolean: - WriteValue((bool?)convertible.ToBoolean(CultureInfo.InvariantCulture)); + if (nullable) + WriteValue((bool?)convertible.ToBoolean(CultureInfo.InvariantCulture)); + else + WriteValue(convertible.ToBoolean(CultureInfo.InvariantCulture)); return; case TypeCode.SByte: - WriteValue((sbyte?)convertible.ToSByte(CultureInfo.InvariantCulture)); - return; + if (nullable) + WriteValue((sbyte?)convertible.ToSByte(CultureInfo.InvariantCulture)); + else + WriteValue(convertible.ToSByte(CultureInfo.InvariantCulture)); + return; case TypeCode.Int16: - WriteValue((short?)convertible.ToInt16(CultureInfo.InvariantCulture)); + if (nullable) + WriteValue((short?)convertible.ToInt16(CultureInfo.InvariantCulture)); + else + WriteValue(convertible.ToInt16(CultureInfo.InvariantCulture)); return; case TypeCode.UInt16: - WriteValue((ushort?)convertible.ToUInt16(CultureInfo.InvariantCulture)); + if (nullable) + WriteValue((ushort?)convertible.ToUInt16(CultureInfo.InvariantCulture)); + else + WriteValue(convertible.ToUInt16(CultureInfo.InvariantCulture)); return; case TypeCode.Int32: - WriteValue((int?)convertible.ToInt32(CultureInfo.InvariantCulture)); + if (nullable) + WriteValue((int?)convertible.ToInt32(CultureInfo.InvariantCulture)); + else + WriteValue(convertible.ToInt32(CultureInfo.InvariantCulture)); return; case TypeCode.Byte: - WriteValue((byte?)convertible.ToByte(CultureInfo.InvariantCulture)); + if (nullable) + WriteValue((byte?)convertible.ToByte(CultureInfo.InvariantCulture)); + else + WriteValue(convertible.ToByte(CultureInfo.InvariantCulture)); return; case TypeCode.UInt32: - WriteValue((uint?)convertible.ToUInt32(CultureInfo.InvariantCulture)); + if (nullable) + WriteValue((uint?)convertible.ToUInt32(CultureInfo.InvariantCulture)); + else + WriteValue(convertible.ToUInt32(CultureInfo.InvariantCulture)); return; case TypeCode.Int64: - WriteValue((long?)convertible.ToInt64(CultureInfo.InvariantCulture)); + if (nullable) + WriteValue((long?)convertible.ToInt64(CultureInfo.InvariantCulture)); + else + WriteValue(convertible.ToInt64(CultureInfo.InvariantCulture)); return; case TypeCode.UInt64: - WriteValue((ulong?)convertible.ToUInt64(CultureInfo.InvariantCulture)); + if (nullable) + WriteValue((ulong?)convertible.ToUInt64(CultureInfo.InvariantCulture)); + else + WriteValue(convertible.ToUInt64(CultureInfo.InvariantCulture)); return; case TypeCode.Single: - WriteValue((float?)convertible.ToSingle(CultureInfo.InvariantCulture)); + if (nullable) + WriteValue((float?)convertible.ToSingle(CultureInfo.InvariantCulture)); + else + WriteValue(convertible.ToSingle(CultureInfo.InvariantCulture)); return; case TypeCode.Double: - WriteValue((double?)convertible.ToDouble(CultureInfo.InvariantCulture)); + if (nullable) + WriteValue((double?)convertible.ToDouble(CultureInfo.InvariantCulture)); + else + WriteValue(convertible.ToDouble(CultureInfo.InvariantCulture)); return; case TypeCode.DateTime: - WriteValue((DateTime?)convertible.ToDateTime(CultureInfo.InvariantCulture)); + if (nullable) + WriteValue((DateTime?)convertible.ToDateTime(CultureInfo.InvariantCulture)); + else + WriteValue(convertible.ToDateTime(CultureInfo.InvariantCulture)); return; case TypeCode.Decimal: - WriteValue((decimal?)convertible.ToDecimal(CultureInfo.InvariantCulture)); + if (nullable) + WriteValue((decimal?)convertible.ToDecimal(CultureInfo.InvariantCulture)); + else + WriteValue(convertible.ToDecimal(CultureInfo.InvariantCulture)); return; #if !(NETFX_CORE || PORTABLE) case TypeCode.DBNull: @@ -1390,7 +1343,10 @@ namespace Newtonsoft.Json #if !PocketPC && !NET20 else if (value is DateTimeOffset) { - WriteValue((DateTimeOffset?)value); + if (nullable) + WriteValue((DateTimeOffset?)value); + else + WriteValue((DateTimeOffset)value); return; } #endif @@ -1401,7 +1357,10 @@ namespace Newtonsoft.Json } else if (value is Guid) { - WriteValue((Guid?)value); + if (nullable) + WriteValue((Guid?)value); + else + WriteValue((Guid)value); return; } else if (value is Uri) @@ -1411,7 +1370,10 @@ namespace Newtonsoft.Json } else if (value is TimeSpan) { - WriteValue((TimeSpan?)value); + if (nullable) + WriteValue((TimeSpan?)value); + else + WriteValue((TimeSpan)value); return; } diff --git a/Src/Newtonsoft.Json/Properties/AssemblyInfo.cs b/Src/Newtonsoft.Json/Properties/AssemblyInfo.cs index c9794905..833e55c0 100644 --- a/Src/Newtonsoft.Json/Properties/AssemblyInfo.cs +++ b/Src/Newtonsoft.Json/Properties/AssemblyInfo.cs @@ -90,7 +90,7 @@ using System.Security; // by using the '*' as shown below: [assembly: AssemblyVersion("4.5.0.0")] #if !PocketPC -[assembly: AssemblyFileVersion("4.5.11.15809")] +[assembly: AssemblyFileVersion("4.5.11.15810")] #endif [assembly: CLSCompliant(true)]