C#如何将反序列化得到的动态对象转换为指定Tuple复合类型
根因说明
你直接转换失败是因为JsonConvert默认反序列化未知类型为JObject而非你期望的强类型Tuple,as运算符对完全不兼容的类型会直接返回null;二次反序列化失败是因为嵌套的ConcurrentDictionary+Tuple+DataTable组合的类型匹配逻辑,默认序列化配置下无法自动识别。
解决方案
方案1(可修改序列化逻辑时推荐,一劳永逸)
序列化时开启类型名称保留,让Json.Net在序列化结果中嵌入完整类型信息,后续反序列化时可自动还原为原始类型:
// 序列化侧修改代码 string json = JsonConvert.SerializeObject(thatOjbect, new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.All });
后续读取字节反序列化为object后,可直接用as转换为目标Tuple类型,无需额外处理。
方案2(无法修改已存储的历史数据时使用)
直接将得到的动态对象(实际为JObject类型)手动拆分转成目标类型:
// 先转为JObject操作 JObject jResult = receivedObject as JObject; if(jResult == null) { // 补充你的异常处理逻辑 } // 分别转换两个Item DataTable item1 = jResult["Item1"].ToObject<DataTable>(); var item2 = jResult["Item2"].ToObject<ConcurrentDictionary<int, Tuple<DateTime, DateTime>>>(); // 拼装为最终的Tuple var myObj = Tuple.Create(item1, item2);
该方案兼容性最强,只要调试器能看到Item1、Item2字段就可正常转换。
内容的提问来源于stack exchange,提问作者Aleksa Ristic
相关产品推荐
相关产品推荐

