- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
在使用 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<CustomType, string> 类型的对象 Dictionary<CustomType, string > dictionary = new Dictionary<CustomType, string > { { new CustomType { Id = 1 , Name = " one " }, " one " }, { new CustomType { Id = 2 , Name = " two " }, " two " } }; // 序列化字典 string json = JsonSerializer.Serialize(dictionary); // 反序列化字典 Dictionary<CustomType, string > dictionary2 = JsonSerializer.Deserialize<Dictionary<CustomType, string >>(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<CustomType> { public override CustomType Read( ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { // Deserialize object return JsonSerializer.Deserialize<CustomType>( 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<CustomType, string> 类型的对象 Dictionary<CustomType, string > dictionary = new Dictionary<CustomType, string > { { 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<CustomType, string >>(jsonString, options);
。
在上述代码中,我们将 CustomType 类型的 Key 属性作为字典的 Key,在序列化操作中,将 Key 属性序列化为字符串,并在反序列化操作中,将字符串反序列化为 Key 属性.
在使用 System.Text.Json 进行序列化和反序列化操作时,如果要处理字典中 Key 为自定义类型的问题,可以通过定义一个自定义的 JSON 转换器来解决.
在定义自定义的 JSON 转换器时,需要注意以下几点:
本文通过一个实例,介绍了如何使用 System.Text.Json 进行序列化和反序列化操作时,处理字典中 Key 为自定义类型的问题.
在定义自定义的 JSON 转换器时,需要注意类型需要继承自 JsonConverter 类型,并实现 Read、Write、ReadAsPropertyName、WriteAsPropertyName 方法.
本文采用 Chat OpenAI 辅助注水浇筑而成,如有雷同,完全有可能.
- 本文链接: https://www.newbe.pro/ChatAI/How-serialize-custom-type-as-dictionary-key-in-system-text-json /
- 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
最后此篇关于使用System.Text.Json时,如何处理Dictionary中Key为自定义类型的问题的文章就讲到这里了,如果你想了解更多关于使用System.Text.Json时,如何处理Dictionary中Key为自定义类型的问题的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在用 Python (2.6) 编写一个应用程序,需要我使用字典作为数据存储。 我很好奇拥有一个大字典是否更节省内存,或者将其分解为许多(很多)较小的字典,然后拥有一个包含对所有较小字典的引用的“
Convert this [ "Cat" : ["A" : 1, "B": 2], "Mat" : ["C" : 3, "D": 4] ] Into [ "A" : 1,
有什么很酷的快速方法可以让两个字典创建第三个字典,以内连接方式将第一个字典的键映射到第二个字典的值? Dictionary dic1 = new Dictionary {{a1,b1},{a2,b2}
我希望将字典相互嵌套,以便容纳 block 的 xy 坐标。所以我会 IDictionary, IDictionary> 键 Dictionary 包含列、行组合,而值 Dictionary 包含 x
在 C# 中,我需要将数据保存在字典对象中,如下所示: Dictionary> MyDict = new Dictionary>(); 现在我意识到,在某些情况下我需要一些其他(不是字典类的)
第一个Dictionary就像 Dictionary ParentDict = new Dictionary(); ParentDict.Add("A_1", "1")
我似乎无法理解这个问题。我需要使用 LINQ 按内部字典的值对字典进行排序。有什么想法吗? 最佳答案 你的意思是你想要所有的值,按内部值排序? from outerPair in outer from
我想建模一个模式,其中响应是字典: { 'id1': { 'type': 'type1', 'active': true, }, 'id2': { 'type':
我有以下代码要添加或更新(如果已经存在)dict()-dict 中的值: if id not in self.steps: self.steps[ id ] = step else:
我有一个包含字典的 Swift 字典,我想使用存储的属性来访问键值: var json = [NSObject:AnyObject]() var title: String { get
我想创建一个 Dictionary>结构,我想提供一个 IEqualityComparer在包含 APerson 的second 字典中作为关键 如果我只有内部字典,那就是 var f = new D
我有一个集合,其中包含如下文档:文档 1: { "company": "ABC" "application": { "app-1": {"earning_from_src_A": 50,
我正在快速学习。 我发现 dictionary 就像 hash 用于 PHP 或其他一些语言。 那我怎么制作dictionary的dictionary呢?? 我有这样的数据 key:J name:jh
这个问题在这里已经有了答案: Explode a dict - Get all combinations of the values in a dictionary (2 个答案) 关闭 5 个月前
我是编程新手,所以如果我的问题看起来很愚蠢,我很抱歉。我想问一下有没有办法从 Multi.Dictionary 返回key当我有值(value)? 这是我的代码: Dim myDict Set myD
我试图找出标准 Ada 库是否配备了“字典”类型(我的意思是:一种以 格式存储值的数据结构,我可以从中检索 value 使用相应的唯一 key)。 这样的数据结构存在吗?如果是这样,有人可以提供一个
我究竟做错了什么?根据我的测试,objDic.exists 永远不会给出 False! dim objDic set objDic = createobject("scripting.
我想创建一个复合类型,其中包含一个字典作为其命名字段之一。但是明显的语法不起作用。我敢肯定有一些我不明白的基本原理。下面是一个例子: type myType x::Dict() end Jul
julia> hotcell2vocab = Dict([(cell, i-1+vocab_start) for (i,cell) in enumerate(h
我有一个简单的问题:我对 Dictionary.Value 集合进行了很多次迭代,这让我很烦,我必须调用 .ToList() 然后才能调用 .ForEach(),因为它似乎没有可枚举的Dictiona
我是一名优秀的程序员,十分优秀!