-Fixed exception message typo

-Fixed serializer sometimes not using DateParseHandling setting
-Fixed error in JsonWriter.WriteToken when writing a DateTimeOffset
-Fixed error when serializing emitted classes that have a constructor with null named parameters (really?)
This commit is contained in:
James Newton-King
2012-10-02 21:54:10 +13:00
parent 0bf5f27f2f
commit e2a0191ee5
8 changed files with 47 additions and 13 deletions
@@ -76,5 +76,5 @@ using System.Security;
// by using the '*' as shown below: // by using the '*' as shown below:
[assembly: AssemblyVersion("4.5.0.0")] [assembly: AssemblyVersion("4.5.0.0")]
#if !PocketPC #if !PocketPC
[assembly: AssemblyFileVersion("4.5.9.15324")] [assembly: AssemblyFileVersion("4.5.9.15402")]
#endif #endif
@@ -1312,7 +1312,7 @@ keyword such as type of business.""
String strFromTest = JsonConvert.SerializeObject(testClass); String strFromTest = JsonConvert.SerializeObject(testClass);
ExceptionAssert.Throws<JsonSerializationException>( ExceptionAssert.Throws<JsonSerializationException>(
@"Could not create an instance of type Newtonsoft.Json.Tests.TestObjects.ICo. Type is an interface or abstract class and cannot be instantated. Path 'co.Name', line 1, position 14.", @"Could not create an instance of type Newtonsoft.Json.Tests.TestObjects.ICo. Type is an interface or abstract class and cannot be instantiated. Path 'co.Name', line 1, position 14.",
() => () =>
{ {
InterfacePropertyTestClass testFromDe = (InterfacePropertyTestClass)JsonConvert.DeserializeObject(strFromTest, typeof(InterfacePropertyTestClass)); InterfacePropertyTestClass testFromDe = (InterfacePropertyTestClass)JsonConvert.DeserializeObject(strFromTest, typeof(InterfacePropertyTestClass));
@@ -7162,6 +7162,23 @@ Parameter name: value",
}", json); }", json);
} }
#endif #endif
#if !NET20
[Test]
public void RoundtripOfDateTimeOffset()
{
var content = @"{""startDateTime"":""2012-07-19T14:30:00+09:30""}";
var jsonSerializerSettings = new JsonSerializerSettings() {DateFormatHandling = DateFormatHandling.IsoDateFormat, DateParseHandling = DateParseHandling.DateTimeOffset, DateTimeZoneHandling = DateTimeZoneHandling.RoundtripKind};
var obj = (JObject)JsonConvert.DeserializeObject(content, jsonSerializerSettings);
var dateTimeOffset = (DateTimeOffset)((JValue) obj["startDateTime"]).Value;
Assert.AreEqual(TimeSpan.FromHours(9.5), dateTimeOffset.Offset);
Assert.AreEqual("07/19/2012 14:30:00 +09:30", dateTimeOffset.ToString(CultureInfo.InvariantCulture));
}
#endif
} }
#if !(SILVERLIGHT || NETFX_CORE || PORTABLE) #if !(SILVERLIGHT || NETFX_CORE || PORTABLE)
+2 -2
View File
@@ -47,8 +47,8 @@ namespace Newtonsoft.Json
/// Ignore members where the member value is the same as the member's default value when serializing objects /// Ignore members where the member value is the same as the member's default value when serializing objects
/// so that is is not written to JSON. /// so that is is not written to JSON.
/// This option will ignore all default values (e.g. <c>null</c> for objects and nullable typesl; <c>0</c> for integers, /// This option will ignore all default values (e.g. <c>null</c> for objects and nullable typesl; <c>0</c> for integers,
/// decimals and floating point numbers; and <c>false</c> for booleans). The default value ignored can be override by /// decimals and floating point numbers; and <c>false</c> for booleans). The default value ignored can be changed by
/// the <see cref="DefaultValueAttribute"/>. /// placing the <see cref="DefaultValueAttribute"/> on the property.
/// </summary> /// </summary>
Ignore = 1, Ignore = 1,
/// <summary> /// <summary>
+1 -1
View File
@@ -530,7 +530,7 @@ namespace Newtonsoft.Json
reader.DateTimeZoneHandling = _dateTimeZoneHandling.Value; reader.DateTimeZoneHandling = _dateTimeZoneHandling.Value;
} }
DateParseHandling? previousDateParseHandling = null; DateParseHandling? previousDateParseHandling = null;
if (_dateParseHandling != null && reader.DateTimeZoneHandling != _dateTimeZoneHandling) if (_dateParseHandling != null && reader.DateParseHandling != _dateParseHandling)
{ {
previousDateParseHandling = reader.DateParseHandling; previousDateParseHandling = reader.DateParseHandling;
reader.DateParseHandling = _dateParseHandling.Value; reader.DateParseHandling = _dateParseHandling.Value;
+18 -4
View File
@@ -432,13 +432,22 @@ namespace Newtonsoft.Json
WritePropertyName(reader.Value.ToString()); WritePropertyName(reader.Value.ToString());
break; break;
case JsonToken.Comment: case JsonToken.Comment:
WriteComment(reader.Value.ToString()); WriteComment((reader.Value != null) ? reader.Value.ToString() : null);
break; break;
case JsonToken.Integer: case JsonToken.Integer:
WriteValue(Convert.ToInt64(reader.Value, CultureInfo.InvariantCulture)); WriteValue(Convert.ToInt64(reader.Value, CultureInfo.InvariantCulture));
break; break;
case JsonToken.Float: case JsonToken.Float:
WriteValue(Convert.ToDouble(reader.Value, CultureInfo.InvariantCulture)); object value = reader.Value;
if (value is decimal)
WriteValue((decimal)value);
else if (value is double)
WriteValue((double)value);
else if (value is float)
WriteValue((float)value);
else
WriteValue(Convert.ToDouble(value, CultureInfo.InvariantCulture));
break; break;
case JsonToken.String: case JsonToken.String:
WriteValue(reader.Value.ToString()); WriteValue(reader.Value.ToString());
@@ -462,10 +471,15 @@ namespace Newtonsoft.Json
WriteEndConstructor(); WriteEndConstructor();
break; break;
case JsonToken.Date: case JsonToken.Date:
WriteValue((DateTime)reader.Value); #if !PocketPC && !NET20
if (reader.Value is DateTimeOffset)
WriteValue((DateTimeOffset)reader.Value);
else
#endif
WriteValue(Convert.ToDateTime(reader.Value, CultureInfo.InvariantCulture));
break; break;
case JsonToken.Raw: case JsonToken.Raw:
WriteRawValue((string)reader.Value); WriteRawValue((reader.Value != null) ? reader.Value.ToString() : null);
break; break;
case JsonToken.Bytes: case JsonToken.Bytes:
WriteValue((byte[])reader.Value); WriteValue((byte[])reader.Value);
@@ -90,7 +90,7 @@ using System.Security;
// by using the '*' as shown below: // by using the '*' as shown below:
[assembly: AssemblyVersion("4.5.0.0")] [assembly: AssemblyVersion("4.5.0.0")]
#if !PocketPC #if !PocketPC
[assembly: AssemblyFileVersion("4.5.9.15324")] [assembly: AssemblyFileVersion("4.5.9.15402")]
#endif #endif
[assembly: CLSCompliant(true)] [assembly: CLSCompliant(true)]
@@ -432,7 +432,10 @@ namespace Newtonsoft.Json.Serialization
foreach (ParameterInfo parameterInfo in constructorParameters) foreach (ParameterInfo parameterInfo in constructorParameters)
{ {
JsonProperty matchingMemberProperty = memberProperties.GetClosestMatchProperty(parameterInfo.Name); // it is possible to generate a ParameterInfo with a null name using Reflection.Emit
// protect against an ArgumentNullException from GetClosestMatchProperty by testing for null here
JsonProperty matchingMemberProperty = (parameterInfo.Name != null) ? memberProperties.GetClosestMatchProperty(parameterInfo.Name) : null;
// type must match as well as name // type must match as well as name
if (matchingMemberProperty != null && matchingMemberProperty.PropertyType != parameterInfo.ParameterType) if (matchingMemberProperty != null && matchingMemberProperty.PropertyType != parameterInfo.ParameterType)
matchingMemberProperty = null; matchingMemberProperty = null;
@@ -1165,7 +1165,7 @@ To fix this error either change the environment to be fully trusted, change the
IDynamicMetaObjectProvider newObject; IDynamicMetaObjectProvider newObject;
if (contract.UnderlyingType.IsInterface() || contract.UnderlyingType.IsAbstract()) if (contract.UnderlyingType.IsInterface() || contract.UnderlyingType.IsAbstract())
throw JsonSerializationException.Create(reader, "Could not create an instance of type {0}. Type is an interface or abstract class and cannot be instantated.".FormatWith(CultureInfo.InvariantCulture, contract.UnderlyingType)); throw JsonSerializationException.Create(reader, "Could not create an instance of type {0}. Type is an interface or abstract class and cannot be instantiated.".FormatWith(CultureInfo.InvariantCulture, contract.UnderlyingType));
if (contract.DefaultCreator != null && if (contract.DefaultCreator != null &&
(!contract.DefaultCreatorNonPublic || Serializer.ConstructorHandling == ConstructorHandling.AllowNonPublicDefaultConstructor)) (!contract.DefaultCreatorNonPublic || Serializer.ConstructorHandling == ConstructorHandling.AllowNonPublicDefaultConstructor))
@@ -1446,7 +1446,7 @@ To fix this error either change the environment to be fully trusted, change the
object newObject = null; object newObject = null;
if (objectContract.UnderlyingType.IsInterface() || objectContract.UnderlyingType.IsAbstract()) if (objectContract.UnderlyingType.IsInterface() || objectContract.UnderlyingType.IsAbstract())
throw JsonSerializationException.Create(reader, "Could not create an instance of type {0}. Type is an interface or abstract class and cannot be instantated.".FormatWith(CultureInfo.InvariantCulture, objectContract.UnderlyingType)); throw JsonSerializationException.Create(reader, "Could not create an instance of type {0}. Type is an interface or abstract class and cannot be instantiated.".FormatWith(CultureInfo.InvariantCulture, objectContract.UnderlyingType));
if (objectContract.OverrideConstructor != null) if (objectContract.OverrideConstructor != null)
{ {