diff --git a/Src/Newtonsoft.Json.Tests/Serialization/JsonSerializerTest.cs b/Src/Newtonsoft.Json.Tests/Serialization/JsonSerializerTest.cs index 401bf60c..1d4fb837 100644 --- a/Src/Newtonsoft.Json.Tests/Serialization/JsonSerializerTest.cs +++ b/Src/Newtonsoft.Json.Tests/Serialization/JsonSerializerTest.cs @@ -10109,6 +10109,58 @@ This is just junk, though."; Assert.AreEqual(propertyValue, testObject.GetPropertyValue(), "MyProperty should be populated"); } + + [Test] + public void JsonPropertyConverter() + { + DateTime dt = new DateTime(2000, 12, 20, 0, 0, 0, DateTimeKind.Utc); + + JsonSerializerSettings settings = new JsonSerializerSettings + { + ContractResolver = new JsonPropertyConverterContractResolver(), + Formatting = Formatting.Indented + }; + + JsonPropertyConverterTestClass c1 = new JsonPropertyConverterTestClass + { + NormalDate = dt, + JavaScriptDate = dt + }; + + string json = JsonConvert.SerializeObject(c1, settings); + + StringAssert.AreEqual(@"{ + ""NormalDate"": ""2000-12-20T00:00:00Z"", + ""JavaScriptDate"": new Date( + 977270400000 + ) +}", json); + + JsonPropertyConverterTestClass c2 = JsonConvert.DeserializeObject(json, settings); + + Assert.AreEqual(dt, c2.NormalDate); + Assert.AreEqual(dt, c2.JavaScriptDate); + } + } + + public class JsonPropertyConverterTestClass + { + public DateTime NormalDate { get; set; } + public DateTime JavaScriptDate { get; set; } + } + + public class JsonPropertyConverterContractResolver : DefaultContractResolver + { + protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization) + { + JsonProperty property = base.CreateProperty(member, memberSerialization); + if (property.PropertyName == "JavaScriptDate") + { + property.Converter = new JavaScriptDateTimeConverter(); + } + + return property; + } } public class BaseClassWithProtectedVirtual diff --git a/Src/Newtonsoft.Json/Serialization/DefaultContractResolver.cs b/Src/Newtonsoft.Json/Serialization/DefaultContractResolver.cs index 6b68d9f0..4ad63c07 100644 --- a/Src/Newtonsoft.Json/Serialization/DefaultContractResolver.cs +++ b/Src/Newtonsoft.Json/Serialization/DefaultContractResolver.cs @@ -709,7 +709,6 @@ namespace Newtonsoft.Json.Serialization { property.PropertyName = (property.PropertyName != parameterInfo.Name) ? property.PropertyName : matchingMemberProperty.PropertyName; property.Converter = property.Converter ?? matchingMemberProperty.Converter; - property.MemberConverter = property.MemberConverter ?? matchingMemberProperty.MemberConverter; if (!property._hasExplicitDefaultValue && matchingMemberProperty._hasExplicitDefaultValue) { @@ -1560,7 +1559,6 @@ namespace Newtonsoft.Json.Serialization // resolve converter for property // the class type might have a converter but the property converter takes precedence property.Converter = JsonTypeReflector.GetJsonConverter(attributeProvider); - property.MemberConverter = JsonTypeReflector.GetJsonConverter(attributeProvider); DefaultValueAttribute defaultValueAttribute = JsonTypeReflector.GetAttribute(attributeProvider); if (defaultValueAttribute != null) diff --git a/Src/Newtonsoft.Json/Serialization/JsonProperty.cs b/Src/Newtonsoft.Json/Serialization/JsonProperty.cs index 183b0cf2..886abec7 100644 --- a/Src/Newtonsoft.Json/Serialization/JsonProperty.cs +++ b/Src/Newtonsoft.Json/Serialization/JsonProperty.cs @@ -122,7 +122,12 @@ namespace Newtonsoft.Json.Serialization /// Gets or sets the member converter. /// /// The member converter. - public JsonConverter MemberConverter { get; set; } + [Obsolete("MemberConverter is obsolete. Use Converter instead.")] + public JsonConverter MemberConverter + { + get { return Converter; } + set { Converter = value; } + } /// /// Gets or sets a value indicating whether this is ignored. diff --git a/Src/Newtonsoft.Json/Serialization/JsonSerializerInternalReader.cs b/Src/Newtonsoft.Json/Serialization/JsonSerializerInternalReader.cs index 5d5d1ca0..d28e854c 100644 --- a/Src/Newtonsoft.Json/Serialization/JsonSerializerInternalReader.cs +++ b/Src/Newtonsoft.Json/Serialization/JsonSerializerInternalReader.cs @@ -1111,7 +1111,7 @@ namespace Newtonsoft.Json.Serialization if (propertyContract != property.PropertyContract) { - propertyConverter = GetConverter(propertyContract, property.MemberConverter, containerContract, containerProperty); + propertyConverter = GetConverter(propertyContract, property.Converter, containerContract, containerProperty); } } @@ -1823,7 +1823,7 @@ namespace Newtonsoft.Json.Serialization property.PropertyContract = GetContractSafe(property.PropertyType); } - JsonConverter propertyConverter = GetConverter(property.PropertyContract, property.MemberConverter, null, null); + JsonConverter propertyConverter = GetConverter(property.PropertyContract, property.Converter, null, null); if (!SetPropertyValue(property, propertyConverter, null, member, reader, newObject)) { @@ -2160,7 +2160,7 @@ namespace Newtonsoft.Json.Serialization property.PropertyContract = GetContractSafe(property.PropertyType); } - JsonConverter propertyConverter = GetConverter(property.PropertyContract, property.MemberConverter, contract, containerProperty); + JsonConverter propertyConverter = GetConverter(property.PropertyContract, property.Converter, contract, containerProperty); if (!reader.ReadForType(property.PropertyContract, propertyConverter != null)) { @@ -2340,7 +2340,7 @@ namespace Newtonsoft.Json.Serialization property.PropertyContract = GetContractSafe(property.PropertyType); } - JsonConverter propertyConverter = GetConverter(property.PropertyContract, property.MemberConverter, contract, member); + JsonConverter propertyConverter = GetConverter(property.PropertyContract, property.Converter, contract, member); if (!reader.ReadForType(property.PropertyContract, propertyConverter != null)) {