-Added CheckAdditionalContent to JsonSerializer/JsonSerializerSettings
-Fixed bad JSON in an array with error handling creating an infinite loop -JsonTextReader no longer returns no content after consecutive underlying content read failures
This commit is contained in:
@@ -165,8 +165,16 @@ namespace Newtonsoft.Json.Tests.Serialization
|
||||
{
|
||||
List<string> errors = new List<string>();
|
||||
|
||||
List<DateTime> c = JsonConvert.DeserializeObject<List<DateTime>>(
|
||||
@"[
|
||||
JsonSerializer serializer = JsonSerializer.Create(new JsonSerializerSettings
|
||||
{
|
||||
Error = delegate(object sender, ErrorEventArgs args)
|
||||
{
|
||||
errors.Add(args.ErrorContext.Path + " - " + args.ErrorContext.Member + " - " + args.ErrorContext.Error.Message);
|
||||
args.ErrorContext.Handled = true;
|
||||
},
|
||||
Converters = { new IsoDateTimeConverter() }
|
||||
});
|
||||
var c = serializer.Deserialize<List<DateTime>>(new JsonTextReader(new StringReader(@"[
|
||||
""2009-09-09T00:00:00Z"",
|
||||
""I am not a date and will error!"",
|
||||
[
|
||||
@@ -175,16 +183,8 @@ namespace Newtonsoft.Json.Tests.Serialization
|
||||
""1977-02-20T00:00:00Z"",
|
||||
null,
|
||||
""2000-12-01T00:00:00Z""
|
||||
]",
|
||||
new JsonSerializerSettings
|
||||
{
|
||||
Error = delegate(object sender, ErrorEventArgs args)
|
||||
{
|
||||
errors.Add(args.ErrorContext.Path + " - " + args.ErrorContext.Member + " - " + args.ErrorContext.Error.Message);
|
||||
args.ErrorContext.Handled = true;
|
||||
},
|
||||
Converters = {new IsoDateTimeConverter()}
|
||||
});
|
||||
]")));
|
||||
|
||||
|
||||
// 2009-09-09T00:00:00Z
|
||||
// 1977-02-20T00:00:00Z
|
||||
@@ -377,11 +377,60 @@ namespace Newtonsoft.Json.Tests.Serialization
|
||||
ErrorPerson[] result = serializer.Deserialize<ErrorPerson[]>(new JsonTextReader(new ThrowingReader()));
|
||||
|
||||
Assert.IsNull(result);
|
||||
Assert.AreEqual(4, errors.Count);
|
||||
Assert.AreEqual(3, errors.Count);
|
||||
Assert.AreEqual("too far", errors[0]);
|
||||
Assert.AreEqual("too far", errors[1]);
|
||||
Assert.AreEqual("too far", errors[2]);
|
||||
Assert.AreEqual("Unexpected end when deserializing array. Path '[1023]', line 1, position 65536.", errors[3]);
|
||||
Assert.AreEqual("Infinite loop detected from error handling. Path '[1023]', line 1, position 65536.", errors[2]);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void InfiniteLoopArrayHandling()
|
||||
{
|
||||
IList<string> errors = new List<string>();
|
||||
|
||||
object o = JsonConvert.DeserializeObject(
|
||||
"[0,x]",
|
||||
typeof (int[]),
|
||||
new JsonSerializerSettings
|
||||
{
|
||||
Error = (sender, arg) =>
|
||||
{
|
||||
errors.Add(arg.ErrorContext.Error.Message);
|
||||
arg.ErrorContext.Handled = true;
|
||||
}
|
||||
});
|
||||
|
||||
Assert.IsNull(o);
|
||||
|
||||
Assert.AreEqual(3, errors.Count);
|
||||
Assert.AreEqual("Unexpected character encountered while parsing value: x. Path '[0]', line 1, position 3.", errors[0]);
|
||||
Assert.AreEqual("Unexpected character encountered while parsing value: x. Path '[0]', line 1, position 3.", errors[1]);
|
||||
Assert.AreEqual("Infinite loop detected from error handling. Path '[0]', line 1, position 3.", errors[2]);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void InfiniteLoopArrayHandlingInObject()
|
||||
{
|
||||
IList<string> errors = new List<string>();
|
||||
|
||||
Dictionary<string, int[]> o = JsonConvert.DeserializeObject<Dictionary<string, int[]>>(
|
||||
"{'badarray':[0,x,2],'goodarray':[0,1,2]}",
|
||||
new JsonSerializerSettings
|
||||
{
|
||||
Error = (sender, arg) =>
|
||||
{
|
||||
errors.Add(arg.ErrorContext.Error.Message);
|
||||
arg.ErrorContext.Handled = true;
|
||||
}
|
||||
});
|
||||
|
||||
Assert.IsNull(o);
|
||||
|
||||
Assert.AreEqual(4, errors.Count);
|
||||
Assert.AreEqual("Unexpected character encountered while parsing value: x. Path 'badarray[0]', line 1, position 15.", errors[0]);
|
||||
Assert.AreEqual("Unexpected character encountered while parsing value: x. Path 'badarray[0]', line 1, position 15.", errors[1]);
|
||||
Assert.AreEqual("Infinite loop detected from error handling. Path 'badarray[0]', line 1, position 15.", errors[2]);
|
||||
Assert.AreEqual("Unexpected character encountered while parsing value: x. Path 'badarray[0]', line 1, position 15.", errors[3]);
|
||||
}
|
||||
|
||||
public class ThrowingReader : TextReader
|
||||
|
||||
Reference in New Issue
Block a user