如何将JSON数组数据存入C#集合?附问题代码求优化方案
解决方法
你的代码跑不起来,核心问题是JSON的根结构不是直接的数组,而是一个包着AccountDetails数组的对象,直接反序列化成List<Member>肯定匹配不上。下面是修正后的实现,同时给你性能更优的方案:
1. 先定义匹配JSON的实体类
// 对应数组里的每条账号数据 public class Member { public string InNumber { get; set; } public string OutNumber { get; set; } } // 对应整个JSON的根对象 public class AccountResponse { public List<Member> AccountDetails { get; set; } }
2. 正确反序列化拿到List
用你原来的Newtonsoft.Json
// 假设jsonString是你从API拿到的完整JSON字符串 var accountResponse = JsonConvert.DeserializeObject<AccountResponse>(jsonString); List<Member> persons = accountResponse.AccountDetails;
用.NET内置的System.Text.Json(性能更优)
如果是.NET Core/.NET 5及以上版本,优先用这个内置库,速度比Newtonsoft快不少:
var accountResponse = JsonSerializer.Deserialize<AccountResponse>(jsonString); List<Member> persons = accountResponse.AccountDetails;
3. 高效转成DataTable
如果一定要转DataTable,推荐直接用JSON库的内置方法,比手动循环性能好很多:
Newtonsoft.Json直接转DataTable
跳过实体类反序列化的步骤,直接把JSON里的AccountDetails数组转成DataTable:
var jsonObj = JObject.Parse(jsonString); DataTable dt = jsonObj["AccountDetails"].ToObject<DataTable>();
手动循环的优化版(必须过实体类的情况)
如果一定要先拿到实体类集合再转,提前设置DataTable的容量,减少内存扩容的开销:
DataTable dt = new DataTable(); dt.Columns.Add("InNumber", typeof(string)); dt.Columns.Add("OutNumber", typeof(string)); // 提前预留行容量,避免多次内存分配 dt.Rows.Add(persons.Count); for (int i = 0; i < persons.Count; i++) { var item = persons[i]; dt.Rows[i]["InNumber"] = item.InNumber; dt.Rows[i]["OutNumber"] = item.OutNumber; }
性能参考
- .NET内置的
System.Text.Json比Newtonsoft.Json性能高30%-50%(.NET 6+版本),新项目优先用这个。 - 直接从JSON转DataTable比先转实体类再循环转更高效,少了中间对象的创建和销毁开销。
内容的提问来源于stack exchange,提问作者user613400
相关产品推荐
相关产品推荐

