-Fixed error when deserializing null DataSet or DataTable properties
This commit is contained in:
@@ -106,6 +106,53 @@ namespace Newtonsoft.Json.Tests.Converters
|
||||
Assert.AreEqual(2, dt.Rows.Count);
|
||||
}
|
||||
|
||||
public class DataSetTestClass
|
||||
{
|
||||
public DataSet Set { get; set; }
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void SerializeNull()
|
||||
{
|
||||
DataSetTestClass c1 = new DataSetTestClass
|
||||
{
|
||||
Set = null
|
||||
};
|
||||
|
||||
string json = JsonConvert.SerializeObject(c1, Formatting.Indented);
|
||||
|
||||
StringAssert.AreEqual(@"{
|
||||
""Set"": null
|
||||
}", json);
|
||||
|
||||
DataSetTestClass c2 = JsonConvert.DeserializeObject<DataSetTestClass>(json);
|
||||
|
||||
Assert.AreEqual(null, c2.Set);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void SerializeNullRoot()
|
||||
{
|
||||
string json = JsonConvert.SerializeObject(null, typeof(DataSet), new JsonSerializerSettings
|
||||
{
|
||||
Formatting = Formatting.Indented
|
||||
});
|
||||
|
||||
StringAssert.AreEqual(@"null", json);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void DeserializeNullTable()
|
||||
{
|
||||
string json = @"{
|
||||
""TableName"": null
|
||||
}";
|
||||
|
||||
DataSet ds = JsonConvert.DeserializeObject<DataSet>(json);
|
||||
|
||||
Assert.AreEqual(true, ds.Tables.Contains("TableName"));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void SerializeMultiTableDataSet()
|
||||
{
|
||||
|
||||
@@ -454,6 +454,41 @@ namespace Newtonsoft.Json.Tests.Converters
|
||||
Assert.AreEqual("432", dt[0].CustomerID);
|
||||
}
|
||||
|
||||
public class DataTableTestClass
|
||||
{
|
||||
public DataTable Table { get; set; }
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void SerializeNull()
|
||||
{
|
||||
DataTableTestClass c1 = new DataTableTestClass
|
||||
{
|
||||
Table = null
|
||||
};
|
||||
|
||||
string json = JsonConvert.SerializeObject(c1, Formatting.Indented);
|
||||
|
||||
StringAssert.AreEqual(@"{
|
||||
""Table"": null
|
||||
}", json);
|
||||
|
||||
DataTableTestClass c2 = JsonConvert.DeserializeObject<DataTableTestClass>(json);
|
||||
|
||||
Assert.AreEqual(null, c2.Table);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void SerializeNullRoot()
|
||||
{
|
||||
string json = JsonConvert.SerializeObject(null, typeof(DataTable), new JsonSerializerSettings
|
||||
{
|
||||
Formatting = Formatting.Indented
|
||||
});
|
||||
|
||||
StringAssert.AreEqual(@"null", json);
|
||||
}
|
||||
|
||||
#if !(NET20 || PORTABLE || PORTABLE40)
|
||||
[Test]
|
||||
public void DeserializedTypedDataTableWithConverter()
|
||||
|
||||
@@ -70,6 +70,11 @@ namespace Newtonsoft.Json.Converters
|
||||
/// <returns>The object value.</returns>
|
||||
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
|
||||
{
|
||||
if (reader.TokenType == JsonToken.Null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
// handle typed datasets
|
||||
DataSet ds = (objectType == typeof(DataSet))
|
||||
? new DataSet()
|
||||
@@ -87,7 +92,9 @@ namespace Newtonsoft.Json.Converters
|
||||
dt = (DataTable)converter.ReadJson(reader, typeof(DataTable), dt, serializer);
|
||||
|
||||
if (!exists)
|
||||
{
|
||||
ds.Tables.Add(dt);
|
||||
}
|
||||
|
||||
CheckedRead(reader);
|
||||
}
|
||||
@@ -110,9 +117,10 @@ namespace Newtonsoft.Json.Converters
|
||||
private void CheckedRead(JsonReader reader)
|
||||
{
|
||||
if (!reader.Read())
|
||||
{
|
||||
throw JsonSerializationException.Create(reader, "Unexpected end when reading DataSet.");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -80,6 +80,11 @@ namespace Newtonsoft.Json.Converters
|
||||
/// <returns>The object value.</returns>
|
||||
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
|
||||
{
|
||||
if (reader.TokenType == JsonToken.Null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
DataTable dt = existingValue as DataTable;
|
||||
|
||||
if (dt == null)
|
||||
@@ -90,15 +95,24 @@ namespace Newtonsoft.Json.Converters
|
||||
: (DataTable)Activator.CreateInstance(objectType);
|
||||
}
|
||||
|
||||
// DataTable is inside a DataSet
|
||||
// populate the name from the property name
|
||||
if (reader.TokenType == JsonToken.PropertyName)
|
||||
{
|
||||
dt.TableName = (string)reader.Value;
|
||||
|
||||
CheckedRead(reader);
|
||||
|
||||
if (reader.TokenType == JsonToken.Null)
|
||||
{
|
||||
return dt;
|
||||
}
|
||||
}
|
||||
|
||||
if (reader.TokenType != JsonToken.StartArray)
|
||||
{
|
||||
throw JsonSerializationException.Create(reader, "Unexpected JSON token when reading DataTable. Expected StartArray, got {0}.".FormatWith(CultureInfo.InvariantCulture, reader.TokenType));
|
||||
}
|
||||
|
||||
CheckedRead(reader);
|
||||
|
||||
@@ -134,7 +148,9 @@ namespace Newtonsoft.Json.Converters
|
||||
if (column.DataType == typeof(DataTable))
|
||||
{
|
||||
if (reader.TokenType == JsonToken.StartArray)
|
||||
{
|
||||
CheckedRead(reader);
|
||||
}
|
||||
|
||||
DataTable nestedDt = new DataTable();
|
||||
|
||||
@@ -150,7 +166,9 @@ namespace Newtonsoft.Json.Converters
|
||||
else if (column.DataType.IsArray && column.DataType != typeof(byte[]))
|
||||
{
|
||||
if (reader.TokenType == JsonToken.StartArray)
|
||||
{
|
||||
CheckedRead(reader);
|
||||
}
|
||||
|
||||
List<object> o = new List<object>();
|
||||
|
||||
@@ -196,7 +214,9 @@ namespace Newtonsoft.Json.Converters
|
||||
case JsonToken.StartArray:
|
||||
CheckedRead(reader);
|
||||
if (reader.TokenType == JsonToken.StartObject)
|
||||
return typeof(DataTable); // nested datatable
|
||||
{
|
||||
return typeof (DataTable); // nested datatable
|
||||
}
|
||||
|
||||
Type arrayType = GetColumnDataType(reader);
|
||||
return arrayType.MakeArrayType();
|
||||
@@ -208,7 +228,9 @@ namespace Newtonsoft.Json.Converters
|
||||
private static void CheckedRead(JsonReader reader)
|
||||
{
|
||||
if (!reader.Read())
|
||||
{
|
||||
throw JsonSerializationException.Create(reader, "Unexpected end when reading DataTable.");
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
Reference in New Issue
Block a user