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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 22:52:52