百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程文章 > 正文

C# Json 中如何处理 Dictionary 中 Key 为自定义类型的问题

qiyuwang 2025-03-12 20:13 11 浏览 0 评论

在使用 System.Text.Json 进行 JSON 序列化和反序列化操作时,我们会遇到一个问题:如何处理字典中的 Key 为自定义类型的问题。

背景说明

例如,我们有如下代码:

// 定义一个自定义类型
public class CustomType
{
    public int Id { get; set; }

    public string Name { get; set; }

    // 获取字符串表示的 Key
    public string Key => $"{Id}_{Name}";
}

// 定义一个 Dictionary 类型的对象
Dictionary dictionary = new Dictionary
{
    { new CustomType { Id = 1, Name = "one" }, "one" },
    { new CustomType { Id = 2, Name = "two" }, "two" }
};

// 序列化字典
string json = JsonSerializer.Serialize(dictionary);

// 反序列化字典
Dictionary dictionary2 = JsonSerializer.Deserialize<Dictionary>(json);

在上述代码中,我们定义了一个自定义类型 CustomType,并使用这个类型作为 Dictionary 的 Key 类型。

接下来,我们使用 JsonSerializer.Serialize 方法将字典序列化为 JSON 字符串,并使用
JsonSerializer.Deserialize 方法将 JSON 字符串反序列化为字典。

但是,在上述代码中,我们会发现,序列化字典时,字典中的 Key 会被序列化为一个 JSON 对象,而不是我们想要的字符串。

同样的,在反序列化 JSON 字符串时,JSON 对象中的 Key 会被反序列化为一个 CustomType 类型的对象,而不是我们想要的字符串。

这时,我们就需要使用一个自定义的 JSON 转换器来解决这个问题。

代码示例

首先,我们定义一个继承自 JsonConverter 的类型 CustomTypeConverter,该类型实现了 Read、Write、ReadAsPropertyName、WriteAsPropertyName 方法:

public class CustomTypeConverter : JsonConverter
{
    public override CustomType Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        // Deserialize object
        return JsonSerializer.Deserialize(ref reader, options);
    }

    public override void Write(Utf8JsonWriter writer, CustomType value, JsonSerializerOptions options)
    {
        // Serialize object
        JsonSerializer.Serialize(writer, value, options);
    }

    public override CustomType ReadAsPropertyName(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        // Read key as string
        var stringValue = reader.GetString();

        // Parse string to CustomType
        return ParseCustomType(stringValue);
    }

    public override void WriteAsPropertyName(Utf8JsonWriter writer, CustomType value, JsonSerializerOptions options)
    {
        // Write key as string
        writer.WritePropertyName(value.Key);
    }

    private CustomType ParseCustomType(string value)
    {
        // Parse string to CustomType
        var parts = value.Split("_");
        var id = int.Parse(parts[0]);
        var name = parts[1];

        return new CustomType
        {
            Id = id,
            Name = name
        };
    }
}

在上述代码中,我们将 CustomType 类型的 Key 属性作为字典的 Key,在序列化操作中,将 Key 属性序列化为字符串,并在反序列化操作中,将字符串反序列化为 Key 属性。

接下来,我们使用这个自定义的 JSON 转换器来序列化和反序列化字典:

// 定义一个自定义类型
public class CustomType
{
    public int Id { get; set; }

    public string Name { get; set; }

    // 获取字符串表示的 Key
    public string Key => $"{Id}_{Name}";
}

// 定义一个 Dictionary 类型的对象
Dictionary dictionary = new Dictionary
{
    { new CustomType { Id = 1, Name = "one" }, "one" },
    { new CustomType { Id = 2, Name = "two" }, "two" }
};

// 创建 JsonSerializerOptions 对象
var options = new JsonSerializerOptions();

// 添加自定义的 JSON 转换器
options.
Converters.Add(new CustomTypeConverter());

// 序列化字典
string jsonString = JsonSerializer.Serialize(dictionary, options);

// 反序列化 JSON 字符串
var result = JsonSerializer.Deserialize<Dictionary>(jsonString, options);

在上述代码中,我们将 CustomType 类型的 Key 属性作为字典的 Key,在序列化操作中,将 Key 属性序列化为字符串,并在反序列化操作中,将字符串反序列化为 Key 属性。

使用建议

在使用 System.Text.Json 进行序列化和反序列化操作时,如果要处理字典中 Key 为自定义类型的问题,可以通过定义一个自定义的 JSON 转换器来解决。

在定义自定义的 JSON 转换器时,需要注意以下几点:

  1. 类型需要继承自 JsonConverter 类型。
  2. 类型需要实现 Read、Write、ReadAsPropertyName、WriteAsPropertyName 方法。
  3. 在 Read 方法中,需要将 JSON 字符串反序列化为 T 类型。
  4. 在 Write 方法中,需要将 T 类型序列化为 JSON 字符串。
  5. 在 ReadAsPropertyName 方法中,需要将 JSON 字符串反序列化为字典的 Key 属性。
  6. 在 WriteAsPropertyName 方法中,需要将字典的 Key 属性序列化为 JSON 字符串。

总结

本文通过一个实例,介绍了如何使用 System.Text.Json 进行序列化和反序列化操作时,处理字典中 Key 为自定义类型的问题。

在定义自定义的 JSON 转换器时,需要注意类型需要继承自 JsonConverter 类型,并实现 Read、Write、ReadAsPropertyName、WriteAsPropertyName 方法。

参考资料

  • System.Text.Json
  • How to serialize and deserialize a dictionary with a custom key type

本文采用 Chat OpenAI 辅助注水浇筑而成,如有雷同,完全有可能。

  • 本文作者: newbe36524
  • 本文链接: https://www.newbe.pro/ChatAI/How-serialize-custom-type-as-dictionary-key-in-system-text-json /
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

相关推荐

在Word中分栏设置页码一页两个页码的技巧!

施老师:在正常情况下,Word文档中一页只会出现一个页码。但在某种情况下,比如说:用了分栏后,我们希望一页中出现两个页码,那应该如何实现呢?今天,就由宁双学好网施老师来为大家讲一下,利用域来实现一页两...

如何在关键时刻向上自荐(如何在关键时刻做出正确选择)

抓住机会,挺身而出有种时刻叫“关键时刻”,关键时刻,作为一个认为自己有能力的、训练有素的人,应该考虑挺身而出,甚至应该不考虑就挺身而出。...

WPS Word:跨页的文档表格,快速调整为一页。#Excel

如何快速将跨页的文档表格调整为一页?需要根据两种情况分别处理。如果表格所有行的行高相同,调整为一页的方法有两种。第一种方法是将光标移动到表格内,然后将鼠标移动到表格右下角的方框处,按住鼠标左键向上拖动...

word文档插入下一页分节符(word下一页分页符)

在word文档中,对文档页面进行分页是特别常见的操作,其中的下一页分节符也是用得比较多的,但是一些人不太清楚在哪里设置,也不知道它具体能实现的功能是什么。接下来看看如何在word文档中插入下一页分节符...

word文档如何设置某一页纸张的方向

word文档页面方向有横向和纵向,纵向是默认的纸张方向,有时我们需要将页面设置为横向,或只设置其中某一页方向,应该怎么操作呢?一起来看看下面的详细介绍第一步:...

word怎么单独设置一页为横向(word2019怎样设置单独一页为横向)

word里面其中一页可以改为横向的吗?经过实际操作发现是完全可以的。...

Word如何设置分栏,如何一页内容同时显示一栏和两栏

我们使用Word文档,有时需要用到两栏的排版,甚至一页内容同时包含一栏和两栏的排版,这种格式怎么设置呢?具体步骤如下:首先是两栏排版的设置,直接点击Word文件上方工具栏【布局】,选择【分栏】下面的【...

Word怎么分页?这三个方法可以帮到你

我们不仅可以利用Word编辑文档,还可以编辑文集呢。但是有时候会出现两个部分的文章长短不一,我们需要对文档进行分页处理。这样可以方便我们对文档进行其他操作。那么Word怎么分页呢?大家可以采用下面这...

Word内容稍超一页,如何优化至单页打印?

如何将两页纸的内容,缩到一页打印呢?有时候一页纸多一点内容,我们完全可以缩一下,放到一页来打印。...

[word] word 表格如何跨行显示表头、标题

word表格如何跨行显示表头、标题在Word中的表格如果过长的话,会跨行显示在另一页,如果想要在其它页面上也显示表头,更直观的查看数据。难道要一个个复制表头吗?当然不是,教你简单的方法操作设置Wo...

Word表格跨页如何续上表?(word如何让表格跨页不断掉)

长文档的表格跨页时,你会发现页末空白太多了,这时要怎么调整?选中整张表格,右击【表格属性】,点击【行】选项,之后勾选【允许跨页断行】,点击确定即可解决空白问题。...

Word怎么连续自动生成页码,操作步骤来了!

Word怎么连续自动生成页码,操作步骤来了!...

word文档怎么把两页合并成一页内容?教你4种方法

word怎么把两页合并成一页?word怎么把两页合并成一页?用四种方法演示一下。·方法一:把这一个文档合并成一页,按ctrl加a全选文档,然后右键点击段落,弹出的界面行距改成固定值,磅值可以改小一点,...

如何将Word中的一页的纸张方向设置为横向?这里提供详细步骤

默认情况下,MicrosoftWord将页面定向为纵向视图。虽然这在大多数情况下都很好,但你可能拥有在横向视图中看起来更好的页面或页面组。以下是实现这一目标的两种方法。无论使用哪种方法,请注意,如果...

Word横竖混排你会玩吗?(word横排竖排混合)

我们在用Word排版的时候,一般都是竖版格式,但偶尔会需要到一些特殊的版式要求,比如文档中插入的一个表格,横向的内容比较多,这时就需要用到横版,否则表格显示不全。这种横竖版混排的要求,在Word20...

取消回复欢迎 发表评论: