-Added SpecialPropertiesHandling

This commit is contained in:
James Newton-King
2014-02-12 01:43:46 +13:00
parent 71a91bf34f
commit 0f77cd1b03
30 changed files with 659 additions and 128 deletions
@@ -2345,19 +2345,22 @@ keyword such as type of business.""
[Test]
public void DeserializeRequiredMembersClassNullRequiredValueProperty()
{
ExceptionAssert.Throws<JsonSerializationException>(
"Required property 'FirstName' expects a value but got null. Path '', line 6, position 2.",
() =>
{
string json = @"{
try
{
string json = @"{
""FirstName"": null,
""MiddleName"": null,
""LastName"": null,
""BirthDate"": ""\/Date(977309755000)\/""
}";
JsonConvert.DeserializeObject<RequiredMembersClass>(json);
});
JsonConvert.DeserializeObject<RequiredMembersClass>(json);
Assert.Fail();
}
catch (JsonSerializationException ex)
{
Assert.IsTrue(ex.Message.StartsWith("Required property 'FirstName' expects a value but got null. Path ''"));
}
}
[Test]
@@ -2383,16 +2386,19 @@ keyword such as type of business.""
[Test]
public void RequiredMembersClassMissingRequiredProperty()
{
ExceptionAssert.Throws<JsonSerializationException>(
"Required property 'LastName' not found in JSON. Path '', line 3, position 2.",
() =>
{
string json = @"{
try
{
string json = @"{
""FirstName"": ""Bob""
}";
JsonConvert.DeserializeObject<RequiredMembersClass>(json);
});
JsonConvert.DeserializeObject<RequiredMembersClass>(json);
Assert.Fail();
}
catch (JsonSerializationException ex)
{
Assert.IsTrue(ex.Message.StartsWith("Required property 'LastName' not found in JSON. Path ''"));
}
}
[Test]
@@ -2631,10 +2637,17 @@ keyword such as type of business.""
[Test]
public void RequiredWhenUsingConstructor()
{
string json = "{ 'testProperty1': 'value' }";
try
{
string json = "{ 'testProperty1': 'value' }";
JsonConvert.DeserializeObject<ConstructorAndRequiredTestClass>(json);
ExceptionAssert.Throws<JsonSerializationException>("Required property 'TestProperty2' not found in JSON. Path '', line 1, position 28.",
() => JsonConvert.DeserializeObject<ConstructorAndRequiredTestClass>(json));
Assert.Fail();
}
catch (JsonSerializationException ex)
{
Assert.IsTrue(ex.Message.StartsWith("Required property 'TestProperty2' not found in JSON. Path ''"));
}
}
[Test]
@@ -3351,11 +3364,17 @@ Path '', line 1, position 1.",
{
string json = @"{}";
ExceptionAssert.Throws<JsonSerializationException>(
@"Cannot deserialize the current JSON object (e.g. {""name"":""value""}) into type 'System.Collections.Generic.List`1[Newtonsoft.Json.Tests.TestObjects.Person]' because the type requires a JSON array (e.g. [1,2,3]) to deserialize correctly.
try
{
JsonConvert.DeserializeObject<List<Person>>(json);
Assert.Fail();
}
catch (JsonSerializationException ex)
{
Assert.IsTrue(ex.Message.StartsWith(@"Cannot deserialize the current JSON object (e.g. {""name"":""value""}) into type 'System.Collections.Generic.List`1[Newtonsoft.Json.Tests.TestObjects.Person]' because the type requires a JSON array (e.g. [1,2,3]) to deserialize correctly.
To fix this error either change the JSON to a JSON array (e.g. [1,2,3]) or change the deserialized type so that it is a normal .NET type (e.g. not a primitive type like integer, not a collection type like an array or List<T>) that can be deserialized from a JSON object. JsonObjectAttribute can also be added to the type to force it to deserialize from a JSON object.
Path '', line 1, position 2.",
() => { JsonConvert.DeserializeObject<List<Person>>(json); });
Path ''"));
}
}
[Test]
@@ -3574,17 +3593,21 @@ Path '', line 1, position 2.",
[Test]
public void DeserializePersonKeyedDictionary()
{
ExceptionAssert.Throws<JsonSerializationException>("Could not convert string 'Newtonsoft.Json.Tests.TestObjects.Person' to dictionary key type 'Newtonsoft.Json.Tests.TestObjects.Person'. Create a TypeConverter to convert from the string to the key type object. Path 'Newtonsoft.Json.Tests.TestObjects.Person', line 2, position 46.",
() =>
{
string json =
@"{
try
{
string json =
@"{
""Newtonsoft.Json.Tests.TestObjects.Person"": 1,
""Newtonsoft.Json.Tests.TestObjects.Person"": 2
}";
JsonConvert.DeserializeObject<Dictionary<Person, int>>(json);
});
JsonConvert.DeserializeObject<Dictionary<Person, int>>(json);
Assert.Fail();
}
catch (JsonSerializationException ex)
{
Assert.IsTrue(ex.Message.StartsWith("Could not convert string 'Newtonsoft.Json.Tests.TestObjects.Person' to dictionary key type 'Newtonsoft.Json.Tests.TestObjects.Person'. Create a TypeConverter to convert from the string to the key type object. Path 'Newtonsoft.Json.Tests.TestObjects.Person'"));
}
}
[Test]
@@ -5004,7 +5027,10 @@ To fix this error either change the environment to be fully trusted, change the
child.Add("Name", "Isabell");
child.Add("Father", reference);
var json = JsonConvert.SerializeObject(child);
string json = JsonConvert.SerializeObject(child);
Console.WriteLine(json);
Dictionary<string, object> result = JsonConvert.DeserializeObject<Dictionary<string, object>>(json);
Assert.AreEqual(3, result.Count);
@@ -5447,7 +5473,14 @@ To fix this error either change the environment to be fully trusted, change the
});
Assert.AreEqual("{\"Offset\":\"2000-01-01T00:00:00+06:00\"}", serializeObject);
var deserializeObject = JsonConvert.DeserializeObject<TimeZoneOffsetObject>(serializeObject);
JsonTextReader reader = new JsonTextReader(new StringReader(serializeObject));
reader.DateParseHandling = DateParseHandling.None;
JsonSerializer serializer = new JsonSerializer();
var deserializeObject = serializer.Deserialize<TimeZoneOffsetObject>(reader);
Assert.AreEqual(TimeSpan.FromHours(6), deserializeObject.Offset.Offset);
Assert.AreEqual(new DateTime(2000, 1, 1), deserializeObject.Offset.Date);
}
@@ -5468,7 +5501,13 @@ To fix this error either change the environment to be fully trusted, change the
}, Formatting.None, new JsonSerializerSettings { DateFormatHandling = DateFormatHandling.MicrosoftDateFormat });
Assert.AreEqual("{\"Offset\":\"\\/Date(946663200000+0600)\\/\"}", serializeObject);
var deserializeObject = JsonConvert.DeserializeObject<TimeZoneOffsetObject>(serializeObject);
JsonTextReader reader = new JsonTextReader(new StringReader(serializeObject));
JsonSerializer serializer = new JsonSerializer();
var deserializeObject = serializer.Deserialize<TimeZoneOffsetObject>(reader);
Assert.AreEqual(TimeSpan.FromHours(6), deserializeObject.Offset.Offset);
Assert.AreEqual(new DateTime(2000, 1, 1), deserializeObject.Offset.Date);
}
@@ -5563,7 +5602,12 @@ To fix this error either change the environment to be fully trusted, change the
public void DeserializeDecimalPropertyExact()
{
string json = "{Amount:123456789876543.21}";
Invoice i = JsonConvert.DeserializeObject<Invoice>(json);
JsonTextReader reader = new JsonTextReader(new StringReader(json));
reader.FloatParseHandling = FloatParseHandling.Decimal;
JsonSerializer serializer = new JsonSerializer();
Invoice i = serializer.Deserialize<Invoice>(reader);
Assert.AreEqual(123456789876543.21m, i.Amount);
}
@@ -5579,7 +5623,12 @@ To fix this error either change the environment to be fully trusted, change the
public void DeserializeDecimalDictionaryExact()
{
string json = "{'Value':123456789876543.21}";
IDictionary<string, decimal> d = JsonConvert.DeserializeObject<IDictionary<string, decimal>>(json);
JsonTextReader reader = new JsonTextReader(new StringReader(json));
reader.FloatParseHandling = FloatParseHandling.Decimal;
JsonSerializer serializer = new JsonSerializer();
IDictionary<string, decimal> d = serializer.Deserialize<IDictionary<string, decimal>>(reader);
Assert.AreEqual(123456789876543.21m, d["Value"]);
}
@@ -5794,7 +5843,7 @@ To fix this error either change the environment to be fully trusted, change the
}
[Test]
public void OnError()
public void DeserializeMinValueDecimal()
{
var data = new DecimalTest(decimal.MinValue);
var json = JsonConvert.SerializeObject(data);
@@ -6957,8 +7006,8 @@ To fix this error either change the environment to be fully trusted, change the
[Test]
public void DeserializeUnexpectedEndInt()
{
ExceptionAssert.Throws<JsonSerializationException>(
"Unexpected end when setting PreProperty's value. Path 'PreProperty', line 2, position 18.",
ExceptionAssert.Throws<JsonException>(
null,
() =>
{
string json = @"{
@@ -7395,10 +7444,10 @@ Parameter name: value",
Assert.IsNotNull(o);
Assert.AreEqual(4, errors.Count);
Assert.AreEqual("Required property 'NonAttributeProperty' not found in JSON. Path '', line 1, position 2.", errors[0]);
Assert.AreEqual("Required property 'UnsetProperty' not found in JSON. Path '', line 1, position 2.", errors[1]);
Assert.AreEqual("Required property 'AllowNullProperty' not found in JSON. Path '', line 1, position 2.", errors[2]);
Assert.AreEqual("Required property 'AlwaysProperty' not found in JSON. Path '', line 1, position 2.", errors[3]);
Assert.IsTrue(errors[0].StartsWith("Required property 'NonAttributeProperty' not found in JSON. Path ''"));
Assert.IsTrue(errors[1].StartsWith("Required property 'UnsetProperty' not found in JSON. Path ''"));
Assert.IsTrue(errors[2].StartsWith("Required property 'AllowNullProperty' not found in JSON. Path ''"));
Assert.IsTrue(errors[3].StartsWith("Required property 'AlwaysProperty' not found in JSON. Path ''"));
}
[Test]
@@ -7420,9 +7469,9 @@ Parameter name: value",
Assert.IsNotNull(o);
Assert.AreEqual(3, errors.Count);
Assert.AreEqual("Required property 'NonAttributeProperty' expects a value but got null. Path '', line 1, position 97.", errors[0]);
Assert.AreEqual("Required property 'UnsetProperty' expects a value but got null. Path '', line 1, position 97.", errors[1]);
Assert.AreEqual("Required property 'AlwaysProperty' expects a value but got null. Path '', line 1, position 97.", errors[2]);
Assert.IsTrue(errors[0].StartsWith("Required property 'NonAttributeProperty' expects a value but got null. Path ''"));
Assert.IsTrue(errors[1].StartsWith("Required property 'UnsetProperty' expects a value but got null. Path ''"));
Assert.IsTrue(errors[2].StartsWith("Required property 'AlwaysProperty' expects a value but got null. Path ''"));
}
[Test]
@@ -8552,8 +8601,8 @@ Parameter name: value",
{
string json = @"{""Before"":""Before!"",""Coordinates"":[/*hi*/[/*hi*/[1/*hi*/,/*hi*/1/*hi*/,1]/*hi*/,/*hi*/[1,1";
ExceptionAssert.Throws<JsonSerializationException>(
"Unexpected end when deserializing array. Path 'Coordinates[0][1][1]', line 1, position 90.",
ExceptionAssert.Throws<JsonException>(
null,
() => JsonConvert.DeserializeObject<Array3D>(json));
}
@@ -8562,8 +8611,8 @@ Parameter name: value",
{
string json = @"{""Before"":""Before!"",""Coordinates"":[/*hi*/[/*hi*/";
ExceptionAssert.Throws<JsonSerializationException>(
"Unexpected end when deserializing array. Path 'Coordinates[0]', line 1, position 48.",
ExceptionAssert.Throws<JsonException>(
null,
() => JsonConvert.DeserializeObject<Array3D>(json));
}