bah*_*ani 1 serialization asp.net-core system.text.json
您对我们如何 使用System.Text.Json.JsonSerializer序列化 DataSet、DataTable有什么建议吗?
当前它抛出此异常:'检测到不支持的可能的对象循环。这可能是由于循环或对象深度大于最大允许深度 64。
目前没有对 likeDataSet和DataTablein类型的内置支持System.Text.Json(从 .NET Core 3.1 开始)。为了能够序列化这些类型,您需要为JsonConverter<T>您需要的类型实现自己的类型并在JsonSerializerOptions. 为您要求的特定类型编写一个序列化程序应该相当容易。
这是一个适用于序列化的示例(省略了反序列化组件):
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);
}
}
Run Code Online (Sandbox Code Playgroud)
本文档可能会提供更多指导:https : //docs.microsoft.com/en-us/dotnet/standard/serialization/system-text-json-converters-how-to
| 归档时间: |
|
| 查看次数: |
2875 次 |
| 最近记录: |