From af102d637f7a2031cb93a928633a2c1ba1c4fccd Mon Sep 17 00:00:00 2001 From: James Newton-King Date: Sat, 14 Jun 2014 20:35:57 +1200 Subject: [PATCH] -Fixed populating ignored properties with DefaultValueHandling.IgnoreAndPopulate --- .../DefaultValueHandlingTests.cs | 36 +++++++++++++++++++ .../JsonSerializerInternalReader.cs | 2 +- 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/Src/Newtonsoft.Json.Tests/Serialization/DefaultValueHandlingTests.cs b/Src/Newtonsoft.Json.Tests/Serialization/DefaultValueHandlingTests.cs index 05a3e33f..edd023df 100644 --- a/Src/Newtonsoft.Json.Tests/Serialization/DefaultValueHandlingTests.cs +++ b/Src/Newtonsoft.Json.Tests/Serialization/DefaultValueHandlingTests.cs @@ -46,6 +46,42 @@ namespace Newtonsoft.Json.Tests.Serialization [TestFixture] public class DefaultValueHandlingTests : TestFixtureBase { + public class MyClass + { + [JsonIgnore] + public MyEnum Status { get; set; } + + private string _data; + public string Data + { + get { return _data; } + set + { + _data = value; + if (_data != null && _data.StartsWith("Other")) + { + this.Status = MyEnum.Other; + } + } + } + } + + public enum MyEnum + { + Default = 0, + Other + } + + [Test] + public void PopulateWithJsonIgnoreAttribute() + { + string json = "{\"Data\":\"Other with some more text\"}"; + + MyClass result = JsonConvert.DeserializeObject(json, new JsonSerializerSettings() { DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate }); + + Assert.AreEqual(MyEnum.Other, result.Status); + } + [Test] public void Include() { diff --git a/Src/Newtonsoft.Json/Serialization/JsonSerializerInternalReader.cs b/Src/Newtonsoft.Json/Serialization/JsonSerializerInternalReader.cs index 27a2d315..db859024 100644 --- a/Src/Newtonsoft.Json/Serialization/JsonSerializerInternalReader.cs +++ b/Src/Newtonsoft.Json/Serialization/JsonSerializerInternalReader.cs @@ -2020,7 +2020,7 @@ To fix this error either change the environment to be fully trusted, change the if (property.PropertyContract == null) property.PropertyContract = GetContractSafe(property.PropertyType); - if (HasFlag(property.DefaultValueHandling.GetValueOrDefault(Serializer._defaultValueHandling), DefaultValueHandling.Populate) && property.Writable) + if (HasFlag(property.DefaultValueHandling.GetValueOrDefault(Serializer._defaultValueHandling), DefaultValueHandling.Populate) && property.Writable && !property.Ignored) property.ValueProvider.SetValue(newObject, EnsureType(reader, property.GetResolvedDefaultValue(), CultureInfo.InvariantCulture, property.PropertyContract, property.PropertyType)); break; case PropertyPresence.Null: