DataSetConverter
Converts a  DataSet to and from JSON.
            
                using Newtonsoft.Json.Serialization;
using System;
using System.Data;
using System.Runtime.CompilerServices;
namespace Newtonsoft.Json.Converters
{
    [System.Runtime.CompilerServices.NullableContext(1)]
    [System.Runtime.CompilerServices.Nullable(0)]
    public class DataSetConverter : JsonConverter
    {
        public override void WriteJson(JsonWriter writer, [System.Runtime.CompilerServices.Nullable(2)] object value, JsonSerializer serializer)
        {
            if (value == null)
                writer.WriteNull();
            else {
                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();
            }
        }
        [return: System.Runtime.CompilerServices.Nullable(2)]
        public override object ReadJson(JsonReader reader, Type objectType, [System.Runtime.CompilerServices.Nullable(2)] 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;
        }
        public override bool CanConvert(Type valueType)
        {
            return typeof(DataSet).IsAssignableFrom(valueType);
        }
    }
}