System.Text.Json.JsonSerializer 自定义实现序列化 DataSet、DataTable

2023-12-18 12:00:14

System.Text.Json(从 .NET Core 3.1 开始),为了能够序列化这些类型,您需要为JsonConverter<T>您需要的类型实现自己的类型并在JsonSerializerOptions. 为您要求的特定类型编写一个序列化程序应该相当容易。

如果您不想自己实现,有简便的方法,请参考另一篇文章:JsonException: A possible object cycle was detected which is not supported 检测到可能的对象循环,这是不受支持的-CSDN博客

适用于序列化的示例(省略了反序列化组件)代码如下:

public class DataTableConverter : JsonConverter<DataTable>
{
? ? public override DataTable Read(ref Utf8JsonReader reader, Type typeToConvert,
? ? ? ? JsonSerializerOptions options)
? ? {
? ? ? ? throw new NotImplementedException();
? ? }

? ? public override void Write(Utf8JsonWriter writer, DataTable value,
? ? ? ? JsonSerializerOptions options)
? ? {
? ? ? ? writer.WriteStartArray();

? ? ? ? foreach (DataRow row in value.Rows)
? ? ? ? {
? ? ? ? ? ? writer.WriteStartObject();
? ? ? ? ? ? foreach (DataColumn column in row.Table.Columns)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? object columnValue = row[column];

? ? ? ? ? ? ? ? // If necessary:
? ? ? ? ? ? ? ? if (options.IgnoreNullValues)
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? // Do null checks on the values here and skip writing.
? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? writer.WritePropertyName(column.ColumnName);
? ? ? ? ? ? ? ? JsonSerializer.Serialize(writer, columnValue, options);
? ? ? ? ? ? }
? ? ? ? ? ? writer.WriteEndObject();
? ? ? ? }

? ? ? ? writer.WriteEndArray();
? ? }
}

public class DataSetConverter : JsonConverter<DataSet>
{
? ? public override DataSet Read(ref Utf8JsonReader reader, Type typeToConvert,
? ? ? ? JsonSerializerOptions options)
? ? {
? ? ? ? throw new NotImplementedException();
? ? }

? ? public override void Write(Utf8JsonWriter writer, DataSet value,
? ? ? ? JsonSerializerOptions options)
? ? {
? ? ? ? writer.WriteStartObject();
? ? ? ? foreach (DataTable table in value.Tables)
? ? ? ? {
? ? ? ? ? ? writer.WritePropertyName(table.TableName);
? ? ? ? ? ? JsonSerializer.Serialize(writer, table, options);
? ? ? ? }
? ? ? ? writer.WriteEndObject();
? ? }
}

private static void DataSet_Serialization_WithSystemTextJson()
{
? ? var options = new JsonSerializerOptions()
? ? {
? ? ? ? Converters = { new DataTableConverter(), new DataSetConverter() }
? ? };

? ? (DataTable table, DataSet dataSet) = GetDataSetAndTable();

? ? string jsonDataTable = JsonSerializer.Serialize(table, options);
? ? // [{"id":0,"item":"item 0"},{"id":1,"item":"item 1"}]
? ? Console.WriteLine(jsonDataTable);

? ? string jsonDataSet = JsonSerializer.Serialize(dataSet, options);
? ? // {"Table1":[{"id":0,"item":"item 0"},{"id":1,"item":"item 1"}]}
? ? Console.WriteLine(jsonDataSet);

? ? // Local function to create a sample DataTable and DataSet
? ? (DataTable, DataSet) GetDataSetAndTable()
? ? {
? ? ? ? dataSet = new DataSet("dataSet");

? ? ? ? table = new DataTable();
? ? ? ? DataColumn idColumn = new DataColumn("id", typeof(int))
? ? ? ? {
? ? ? ? ? ? AutoIncrement = true
? ? ? ? };

? ? ? ? DataColumn itemColumn = new DataColumn("item");

? ? ? ? table.Columns.Add(idColumn);
? ? ? ? table.Columns.Add(itemColumn);

? ? ? ? dataSet.Tables.Add(table);

? ? ? ? for (int i = 0; i < 2; i++)
? ? ? ? {
? ? ? ? ? ? DataRow newRow = table.NewRow();
? ? ? ? ? ? newRow["item"] = "item " + i;
? ? ? ? ? ? table.Rows.Add(newRow);
? ? ? ? }

? ? ? ? dataSet.AcceptChanges();

? ? ? ? return (table, dataSet);
? ? }
}

查看微软文档,可能会提供更多指导:

How to write custom converters for JSON serialization - .NET | Microsoft Learn

希望本文对你有帮助。?

文章来源:https://blog.csdn.net/hefeng_aspnet/article/details/135058154
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。