如何将.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数据库:
| id | firstName | lastName | roles |
|---|---|---|---|
| abc123 | First1 | Last1 | admin |
| abc124 | First2 | Last2 | admin, 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
相关产品推荐
相关产品推荐

