You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 00:52:18