ASP.NET Core中如何将Dictionary值存入Session?遇类型转换报错
在ASP.NET Core中存储Dictionary到Session的解决方法
错误原因
HttpContext.Session.SetString方法仅支持存储字符串类型数据,你直接传入Dictionary<string, bool>类型对象,自然会触发类型转换错误。
解决方案
方法一:用内置的System.Text.Json序列化
把Dictionary序列化为JSON字符串后存入Session,读取时再反序列化回来:
修改存储代码:
// 将Dictionary序列化为JSON字符串 var roleJson = System.Text.Json.JsonSerializer.Serialize(dicRole); // 存入Session HttpContext.Session.SetString("Role", roleJson);
读取Session中的数据:
// 获取Session里的JSON字符串 var roleJson = HttpContext.Session.GetString("Role"); // 反序列化为Dictionary if (!string.IsNullOrEmpty(roleJson)) { var dicRole = System.Text.Json.JsonSerializer.Deserialize<Dictionary<string, bool>>(roleJson); // 后续使用dicRole }
方法二:用Newtonsoft.Json(Json.NET)序列化
如果你的项目已经引用了Newtonsoft.Json包,也可以用它来处理:
存储代码:
var roleJson = Newtonsoft.Json.JsonConvert.SerializeObject(dicRole); HttpContext.Session.SetString("Role", roleJson);
读取代码:
var roleJson = HttpContext.Session.GetString("Role"); if (!string.IsNullOrEmpty(roleJson)) { var dicRole = Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<string, bool>>(roleJson); // 后续使用dicRole }
优化技巧
如果需要频繁操作复杂类型的Session存储,可以封装一个扩展方法简化流程:
public static class SessionExtensions { public static void Set<T>(this ISession session, string key, T value) { session.SetString(key, System.Text.Json.JsonSerializer.Serialize(value)); } public static T? Get<T>(this ISession session, string key) { var value = session.GetString(key); return value == null ? default : System.Text.Json.JsonSerializer.Deserialize<T>(value); } }
之后存储和读取就可以直接用:
// 存储 HttpContext.Session.Set("Role", dicRole); // 读取 var dicRole = HttpContext.Session.Get<Dictionary<string, bool>>("Role");
内容的提问来源于stack exchange,提问作者Ratchanon Volty
相关产品推荐
相关产品推荐

