using System;
using System.Data;
using DPumpHydr.WinFrmUI.WenSkin.Json.Serialization;
namespace DPumpHydr.WinFrmUI.WenSkin.Json.Converters
{
///
/// Converts a to and from JSON.
///
public class DataSetConverter : JsonConverter
{
///
/// Writes the JSON representation of the object.
///
/// The to write to.
/// The value.
/// The calling serializer.
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
DataSet obj = (DataSet)value;
DefaultContractResolver defaultContractResolver = serializer.ContractResolver as DefaultContractResolver;
DataTableConverter dataTableConverter = new DataTableConverter();
writer.WriteStartObject();
foreach (DataTable table in obj.Tables)
{
writer.WritePropertyName((defaultContractResolver != null) ? defaultContractResolver.GetResolvedPropertyName(table.TableName) : table.TableName);
dataTableConverter.WriteJson(writer, table, serializer);
}
writer.WriteEndObject();
}
///
/// Reads the JSON representation of the object.
///
/// The to read from.
/// Type of the object.
/// The existing value of object being read.
/// The calling serializer.
/// The object value.
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (reader.TokenType == JsonToken.Null)
{
return null;
}
DataSet dataSet = ((objectType == typeof(DataSet)) ? new DataSet() : ((DataSet)Activator.CreateInstance(objectType)));
DataTableConverter dataTableConverter = new DataTableConverter();
reader.ReadAndAssert();
while (reader.TokenType == JsonToken.PropertyName)
{
DataTable dataTable = dataSet.Tables[(string)reader.Value];
bool num = dataTable != null;
dataTable = (DataTable)dataTableConverter.ReadJson(reader, typeof(DataTable), dataTable, serializer);
if (!num)
{
dataSet.Tables.Add(dataTable);
}
reader.ReadAndAssert();
}
return dataSet;
}
///
/// Determines whether this instance can convert the specified value type.
///
/// Type of the value.
///
/// true if this instance can convert the specified value type; otherwise, false.
///
public override bool CanConvert(Type valueType)
{
return typeof(DataSet).IsAssignableFrom(valueType);
}
}
}