DataSetConverter
Converts a DataSet to and from JSON.
using Newtonsoft.Json.Serialization;
using System;
using System.Data;
namespace Newtonsoft.Json.Converters
{
public class DataSetConverter : JsonConverter
{
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
DataSet dataSet = (DataSet)value;
DefaultContractResolver defaultContractResolver = serializer.ContractResolver as DefaultContractResolver;
DataTableConverter dataTableConverter = new DataTableConverter();
writer.WriteStartObject();
foreach (DataTable table in dataSet.Tables) {
writer.WritePropertyName((defaultContractResolver != null) ? defaultContractResolver.GetResolvedPropertyName(table.TableName) : table.TableName);
dataTableConverter.WriteJson(writer, table, serializer);
}
writer.WriteEndObject();
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
DataSet dataSet = ((object)objectType == typeof(DataSet)) ? new DataSet() : ((DataSet)Activator.CreateInstance(objectType));
DataTableConverter dataTableConverter = new DataTableConverter();
CheckedRead(reader);
while (reader.TokenType == JsonToken.PropertyName) {
DataTable dataTable = dataSet.Tables[(string)reader.Value];
bool flag = dataTable != null;
dataTable = (DataTable)dataTableConverter.ReadJson(reader, typeof(DataTable), dataTable, serializer);
if (!flag)
dataSet.Tables.Add(dataTable);
CheckedRead(reader);
}
return dataSet;
}
public override bool CanConvert(Type valueType)
{
return typeof(DataSet).IsAssignableFrom(valueType);
}
private void CheckedRead(JsonReader reader)
{
if (!reader.Read())
throw JsonSerializationException.Create(reader, "Unexpected end when reading DataSet.");
}
}
}