-Fixed invalid Required.Always error with constructor property name casing

-Fixed empty string coerce check with Required.Always and constructor
This commit is contained in:
James Newton-King
2015-06-14 15:55:24 +12:00
parent 3cc797c240
commit 6173ca1574
2 changed files with 60 additions and 2 deletions
@@ -95,6 +95,36 @@ namespace Newtonsoft.Json.Tests.Serialization
[TestFixture]
public class JsonSerializerTest : TestFixtureBase
{
[Test]
public void CaseInsensitiveRequiredPropertyConstructorCreation()
{
FooRequired foo1 = new FooRequired(new[] { "A", "B", "C" });
string json = JsonConvert.SerializeObject(foo1);
StringAssert.AreEqual(@"{""Bars"":[""A"",""B"",""C""]}", json);
FooRequired foo2 = JsonConvert.DeserializeObject<FooRequired>(json);
Assert.AreEqual(foo1.Bars.Count, foo2.Bars.Count);
Assert.AreEqual(foo1.Bars[0], foo2.Bars[0]);
Assert.AreEqual(foo1.Bars[1], foo2.Bars[1]);
Assert.AreEqual(foo1.Bars[2], foo2.Bars[2]);
}
public class FooRequired
{
[JsonProperty(Required = Required.Always)]
public List<string> Bars { get; private set; }
public FooRequired(IEnumerable<string> bars)
{
Bars = new List<string>();
if (bars != null)
{
Bars.AddRange(bars);
}
}
}
[Test]
public void CoercedEmptyStringWithRequired()
{
@@ -104,6 +134,15 @@ namespace Newtonsoft.Json.Tests.Serialization
}, "Required property 'RequiredProperty' expects a value but got null. Path '', line 1, position 21.");
}
[Test]
public void CoercedEmptyStringWithRequiredConstructor()
{
ExceptionAssert.Throws<JsonSerializationException>(() =>
{
JsonConvert.DeserializeObject<FooRequired>("{Bars:''}");
}, "Required property 'Bars' expects a value but got null. Path '', line 1, position 9.");
}
public class Binding
{
[JsonProperty(Required = Required.Always)]
@@ -1661,9 +1661,28 @@ namespace Newtonsoft.Json.Serialization
if (propertiesPresence != null)
{
// map from creator property to normal property
JsonProperty presenceProperty = propertiesPresence.Keys.FirstOrDefault(p => p.PropertyName == property.PropertyName);
JsonProperty presenceProperty = propertiesPresence.Keys.ForgivingCaseSensitiveFind(p => p.PropertyName, property.PropertyName);
if (presenceProperty != null)
propertiesPresence[presenceProperty] = (propertyValue.Value == null) ? PropertyPresence.Null : PropertyPresence.Value;
{
object v = propertyValue.Value;
PropertyPresence propertyPresence;
if (v == null)
{
propertyPresence = PropertyPresence.Null;
}
else if (v is string)
{
propertyPresence = CoerceEmptyStringToNull(property.PropertyType, property.PropertyContract, (string)v)
? PropertyPresence.Null
: PropertyPresence.Value;
}
else
{
propertyPresence = PropertyPresence.Value;
}
propertiesPresence[presenceProperty] = propertyPresence;
}
}
}