データセットを json にシリアル化するソリューションを探していますが、json で行状態を取得する必要があります。
json.net は、rowstate のように、データセット/データテーブルのプロパティをシリアル化/逆シリアル化しますか? 行の値を持つ例しか見つかりません。
ありがとう。
いいえ、DataTableConverter
Json.Net に同梱されている は、RowState
. JSON でこの値が本当に必要な場合は、それJsonConverter
を出力するカスタムを作成できるはずです。RowState
ただし、読み取り専用プロパティであるため、バックを元の値にデシリアライズすることはできません。(実際、この値はさまざまな内部状態変数から計算されます。)
SOAP 呼び出しから WebApi 呼び出しに移行するレガシー アプリを維持RowState
するソリューションが必要でしたが、 . アレックス、私が必要としていた最後の回答をありがとう。DataSets
DataTables
System.Text.Json
これは、同じものの Newtonsoft バージョンです。
using System;
using System.Data;
using System.IO;
using Newtonsoft.Json;
using Xunit;
namespace DataSetsAndTablesTester
{
public class CustomJsonConverter_DataSet : JsonConverter<DataSet>
{
private class DataSetSerializer
{
public string SchemaString { get; set; }
public string DataString { get; set; }
private static string GetSchema(DataSet ds)
{
using (var sw = new StringWriter())
{
ds.WriteXmlSchema(sw);
return sw.ToString();
}
}
private static string GetData(DataSet ds)
{
using (var sw = new StringWriter())
{
ds.WriteXml(sw, XmlWriteMode.DiffGram);
return sw.ToString();
}
}
private DataSet GetDataSet()
{
var ds = new DataSet();
using (var sr1 = new StringReader(SchemaString))
{
ds.ReadXmlSchema(sr1);
}
using (var sr2 = new StringReader(DataString))
{
ds.ReadXml(sr2, XmlReadMode.DiffGram);
}
return ds;
}
public static string Serialize(DataSet ds)
{
var serializer = new DataSetSerializer() { SchemaString = GetSchema(ds), DataString = GetData(ds) };
return JsonConvert.SerializeObject(serializer);
}
public static DataSet DeSerialize(string s)
{
var serializer = JsonConvert.DeserializeObject<DataSetSerializer>(s);
return serializer.GetDataSet();
}
}
public override void WriteJson(JsonWriter writer, DataSet value, JsonSerializer serializer)
{
if (value == null)
throw new Exception("Passed in DataSet is null");
writer.WriteValue(DataSetSerializer.Serialize(ds: value));
}
public override DataSet ReadJson(JsonReader reader, Type objectType, DataSet existingValue, bool hasExistingValue, JsonSerializer serializer)
{
return DataSetSerializer.DeSerialize((string)reader.Value);
}
}
public class CustomJsonConverter_DataTable : JsonConverter<DataTable>
{
private class DataTableSerializer
{
public string SchemaString { get; set; }
public string DataString { get; set; }
private static string GetSchema(DataTable dt)
{
using (var sw = new StringWriter())
{
dt.WriteXmlSchema(sw);
return sw.ToString();
}
}
private static string GetData(DataTable dt)
{
using (var sw = new StringWriter())
{
dt.WriteXml(sw, XmlWriteMode.DiffGram);
return sw.ToString();
}
}
private DataTable GetDataTable()
{
var dt = new DataTable();
using (var sr1 = new StringReader(SchemaString))
{
dt.ReadXmlSchema(sr1);
}
using (var sr2 = new StringReader(DataString))
{
dt.ReadXml(sr2);
}
return dt;
}
public static string Serialize(DataTable dt)
{
var serializer = new DataTableSerializer() { SchemaString = GetSchema(dt), DataString = GetData(dt) };
return JsonConvert.SerializeObject(serializer);
}
public static DataTable DeSerialize(string s)
{
var serializer = JsonConvert.DeserializeObject<DataTableSerializer>(s);
return serializer.GetDataTable();
}
}
public override void WriteJson(JsonWriter writer, DataTable value, JsonSerializer serializer)
{
if (value == null)
throw new Exception("Passed in DataTable is null");
if (string.IsNullOrEmpty(value.TableName))
throw new Exception("Passed in DataTable Name is null or empty");
writer.WriteValue(DataTableSerializer.Serialize(dt: value));
}
public override DataTable ReadJson(JsonReader reader, Type objectType, DataTable existingValue, bool hasExistingValue, JsonSerializer serializer)
{
return DataTableSerializer.DeSerialize((string)reader.Value);
}
}
public class JsonConverterTester
{
public void TestJsonDataSetConverter()
{
DataSet ds = CreateTestDataSet();
String json = JsonConvert.SerializeObject(value: ds, converters: new CustomJsonConverter_DataSet());
Console.WriteLine(json);
DataSet ds2 = JsonConvert.DeserializeObject<DataSet>(value: json, converters: new CustomJsonConverter_DataSet());
CheckTestDataSet(ds2);
}
public void TestJsonDataTableConverter()
{
DataTable dt = CreateTestDataTable();
String json = JsonConvert.SerializeObject(value: dt, converters: new CustomJsonConverter_DataTable());
Console.WriteLine(json);
DataTable dt2 = JsonConvert.DeserializeObject<DataTable>(value: json, converters: new CustomJsonConverter_DataTable());
CheckTestDataTable(dt2);
}
private DataSet CreateTestDataSet()
{
var ds = new DataSet();
var dt = ds.Tables.Add();
dt.Columns.Add("A");
dt.Columns.Add("B");
dt.Rows.Add("A1", "B1");
var dr = dt.Rows.Add("A2", "B2");
ds.AcceptChanges();
dr["A"] = "AA2";
return ds;
}
private void CheckTestDataSet(DataSet ds)
{
var dt = ds.Tables[0];
Assert.True(dt.Rows[0].RowState == DataRowState.Unchanged && dt.Rows[1].RowState == DataRowState.Modified);
}
private DataTable CreateTestDataTable()
{
var dt = new DataTable();
dt.TableName = "TestTable";
dt.Columns.Add("A");
dt.Columns.Add("B");
dt.Rows.Add("A1", "B1");
var dr = dt.Rows.Add("A2", "B2");
dt.AcceptChanges();
dr["A"] = "AA2";
return dt;
}
private void CheckTestDataTable(DataTable dt)
{
Assert.True(dt.Rows[0].RowState == DataRowState.Unchanged && dt.Rows[1].RowState == DataRowState.Modified);
}
}
}