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

如何将.NET中WebAPI返回的模型或JSON转为指定格式DataTable

.NET中将WebAPI返回的JSON转换为指定格式的DataTable

1. WebAPI返回的JSON结构

{
     "total" : 50,
     "users" : [
         {
            "id" : "abc123",
            "firstName" : "First1",
            "lastName" : "Last1",
            "roles" : [
                 "admin"
             ]
         },
         {
            "id" : "abc124",
            "firstName" : "First2",
            "lastName" : "Last2",
            "roles" : [
                 "admin",
                 "normal"
             ]
         }
      ]
 }

2. 定义的模型类

public class ApiResponse
{
     public int total { get; set; }
     public List<Users> users { get; set; }
     public ApiResponse()
     {
          users = new List<Users>();
     }
}

public class Users
{
     public string id { get; set; }
     public string firstName { get; set; }
     public string lastName{ get; set; }
     public List<string> roles { get; set; } 
}

3. 已完成的反序列化操作

var response = myObj.CallRestAPI("url");
ApiResponse data = (ApiResponse)JsonConvert.DeserializeObject(response, typeof(ApiResponse));

4. 需求说明

需要将数据转换为如下格式的DataTable(roles字段为逗号分隔的字符串),用于存入SQL数据库:

idfirstNamelastNameroles
abc123First1Last1admin
abc124First2Last2admin, normal

同时希望了解是否可以直接从JSON字符串转换为该格式的DataTable。

5. 尝试的方法及问题

尝试直接将JSON中的users数组转为DataTable:

JObject jObj = JObject.Parse(response);
DataTable dt = jObj["users"].ToObject<DataTable>();

但得到的DataTable中roles字段显示为System.String[],不符合预期。


解决方案

方法1:从已反序列化的模型对象生成目标DataTable

遍历ApiResponse中的users集合,手动将每个用户的roles列表拼接为逗号分隔的字符串,再添加到DataTable中:

// 创建DataTable并定义列
DataTable userTable = new DataTable();
userTable.Columns.Add("id", typeof(string));
userTable.Columns.Add("firstName", typeof(string));
userTable.Columns.Add("lastName", typeof(string));
userTable.Columns.Add("roles", typeof(string));

// 遍历用户列表,填充DataTable
foreach (var user in data.users)
{
    string rolesStr = string.Join(", ", user.roles);
    userTable.Rows.Add(user.id, user.firstName, user.lastName, rolesStr);
}

方法2:直接从JSON字符串生成目标DataTable

解析JSON的users数组,逐个处理每个用户的roles字段,拼接为字符串后构建DataTable:

JObject jObj = JObject.Parse(response);
JArray usersArray = (JArray)jObj["users"];

DataTable userTable = new DataTable();
userTable.Columns.Add("id", typeof(string));
userTable.Columns.Add("firstName", typeof(string));
userTable.Columns.Add("lastName", typeof(string));
userTable.Columns.Add("roles", typeof(string));

foreach (JObject userObj in usersArray)
{
    string id = userObj["id"].ToString();
    string firstName = userObj["firstName"].ToString();
    string lastName = userObj["lastName"].ToString();
    // 处理roles数组为逗号分隔字符串
    string rolesStr = string.Join(", ", userObj["roles"].Select(r => r.ToString()));
    
    userTable.Rows.Add(id, firstName, lastName, rolesStr);
}

两种方法都能得到符合要求的DataTable,你可以根据实际场景选择:如果已经完成了模型反序列化,用方法1更直接;如果不需要模型对象,直接处理JSON用方法2更高效。


内容的提问来源于stack exchange,提问作者DevP

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 07:01:18