如何在JSON中序列化与反序列化Dictionary<double, double[]>?
如何在JSON中存储和读取Dictionary<double, double[]>类型数据
核心结论
JSON规范要求对象的键必须是字符串,所以无引号数字键的写法确实无效。但不需要手动转嵌套数组,主流JSON序列化库都支持自动处理字符串键与double类型键的转换,完全可以用你第一种带引号键的JSON格式实现需求。
方案1:利用JSON库的自动类型转换(推荐)
不管是Newtonsoft.Json(Json.NET)还是.NET自带的System.Text.Json,都能轻松处理字符串键到double的反序列化,以及double键到字符串的序列化。
示例(Newtonsoft.Json)
序列化代码:
var myDict = new Dictionary<double, double[]> { { 0, new[] { 90, 270 } }, { 90, new[] { 0 } }, { 270, new[] { 0 } } }; // 序列化后生成的JSON就是你第一种带引号键的格式 string json = JsonConvert.SerializeObject(new { MyDic = myDict }, Formatting.Indented);
反序列化代码:
// 定义包含目标字典的类 public class MyData { public Dictionary<double, double[]> MyDic { get; set; } } // 直接反序列化,库会自动把字符串键转成double var data = JsonConvert.DeserializeObject<MyData>(json);
示例(System.Text.Json)
如果用.NET Core/.NET 5+的System.Text.Json,只需配置NumberHandling允许从字符串读取数字:
var options = new JsonSerializerOptions { NumberHandling = JsonNumberHandling.AllowReadingFromString, WriteIndented = true }; // 序列化 string json = JsonSerializer.Serialize(new { MyDic = myDict }, options); // 反序列化 var data = JsonSerializer.Deserialize<MyData>(json, options);
方案2:手动转换为嵌套数组(仅当无法使用库配置时)
如果因为特殊限制不能用库的自动转换,才考虑用你提到的嵌套数组格式,手动处理序列化和反序列化:
序列化代码:
// 把字典转成键值对嵌套数组 var arrayList = myDict.Select(kv => new object[] { kv.Key, kv.Value }).ToList(); string json = JsonConvert.SerializeObject(new { MyDic = arrayList }, Formatting.Indented);
反序列化代码:
// 先反序列化为临时类型 public class TempData { public List<object[]> MyDic { get; set; } } var tempData = JsonConvert.DeserializeObject<TempData>(json); // 手动转换回Dictionary<double, double[]> var myDict = tempData.MyDic.ToDictionary( item => Convert.ToDouble(item[0]), item => item[1] as double[] );
内容的提问来源于stack exchange,提问作者dba
相关产品推荐
相关产品推荐

