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

news/2024/5/19 21:08:32 标签: json, .netcore

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

希望本文对你有帮助。 


http://www.niftyadmin.cn/n/5271718.html

相关文章

★11. 盛最多水的容器(2种方法)

文章目录 [11. 盛最多水的容器](https://leetcode.cn/problems/container-with-most-water/description/)双指针算法。所以大体的思路是ACCode结果分析优化的双重for循环。结果分析11. 盛最多水的容器 本题颇有短板效应的感觉。 自己想的算法也AC了,这里都记录下来。 一个是双…

云仓酒庄的品牌雷盛红酒LEESON分享香槟为什么是“酸”的?

云仓酒庄致力成为红酒爱好者的首选供应商。云仓酒庄品牌雷盛红酒多系列、多国家、多价位区间的多品种供货&#xff0c;使得酒品丰富而多样&#xff0c;既可以整箱方式销售&#xff0c;也可以单瓶模式购买&#xff0c;全管道使成本更低&#xff0c;降低中间仓储环节、支线物流仓…

Windows phpstudy vscode Xdebug调试无效,无法监听,没有什么效果

Windows phpstudy vscode Xdebug调试无效&#xff0c;无法监听&#xff0c;没有什么效果 vscode 正常&#xff0c;能启动&#xff0c;能标记&#xff0c;就是无法监听 打印phpinfo(); Xdebug版本3 打印的信息输入这里&#xff0c;找出对应PHPXdebug的dll文件 Xdebug: Sup…

利用条件概率进行事件预测与分析

条件概率是概率论中的重要概念&#xff0c;它描述了在已知某一事件发生的条件下&#xff0c;另一事件发生的概率。利用条件概率进行事件的预测与分析在各个领域中都有着重要的应用&#xff0c;包括金融、医学、工程、社会科学等。本文将探讨条件概率的定义、性质以及它在现实生…

在线PDF转word工具真香,别再充钱了,快分享给你的女神

别再傻傻的充钱了&#xff0c;本文告诉你几个免费在线文档转换工具&#xff0c;真的是有手就会&#xff0c;免费的用起来就是香。 大家都知道PDF文件是无法编辑的&#xff0c;所以要修改PDF就必须要先转换为Word或其它可编辑的格式文件&#xff0c;网上有很多软件&#xff0c;要…

itext使用问题记录

使用功能&#xff1a;读取html文件转换PDF功能 个人错误记录&#xff1a; 生成的PDF又部分文字及符号乱码 使用代码来源&#xff1a;html转pdf&#xff08;总结五种方法Java&#xff09;_java html转pdf-CSDN博客 个人思路&#xff1a;1.字体使用问题&#xff0c;2.环境的编码…

Sublime Text 4 for Mac/win: 提升前端开发效率的编辑神器

对于前端开发者来说&#xff0c;一个高效的代码编辑器是必不可少的工具。而Sublime Text 4作为一款著名的跨平台编辑器&#xff0c;不仅提供了丰富的功能&#xff0c;还能够极大地提升开发效率。 首先&#xff0c;Sublime Text 4拥有强大的代码编辑功能。它支持多种编程语言和…

spring boot 配置多数据源 踩坑 BindingException: Invalid bound statement (not found)

在上一篇&#xff1a;《【已解决】Spring Boot多数据源的时候&#xff0c;mybatis报错提示&#xff1a;Invalid bound statement (not found)》 凯哥(凯哥Java) 已经接受了&#xff0c;在Spring Boot配置多数据源时候&#xff0c;因为自己马虎&#xff0c;导致的一个坑。下面&a…