System.Text.Json(从 .NET Core 3.1 开始),为了能够序列化这些类型,您需要为JsonConverter
如果您不想自己实现,有简便的方法,请参考另一篇文章:JsonException: A possible object cycle was detected which is not supported 检测到可能的对象循环,这是不受支持的-CSDN博客
适用于序列化的示例(省略了反序列化组件)代码如下:
public class DataTableConverter : JsonConverter
{
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
{
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
希望本文对你有帮助。