JSON字符串不能直接用JsonConvert.DeserializeObject反序列化,因DataTable无默认构造函数;应先解析为JArray或匿名类型再手动构建DataTable,并注意列类型推断、null处理及大小写敏感问题。
JSON字符串直接转DataTable会报错:缺少默认构造函数
用
直接反序列化 JSON 字符串,大概率抛出
。这是因为
不是纯数据容器,它带状态、列定义、约束等运行时信息,Newtonsoft.Json 默认不支持直接映射。
别写
—— 这条路走不通
正确做法是先解析成
或
,再手动构建
如果 JSON 是数组结构(如接口返回的 [{ "id":1,"name":"a" }, ...]),才能转;单个对象或嵌套过深的结构需先扁平化
用 JsonConvert.DeserializeAnonymousType + DataTable.Load 填充最稳
这是兼顾类型安全和可控性的常用路径:先用匿名类型“猜”出字段名和类型,再用
从
导入。比纯反射或手动 AddColumn 更可靠,尤其对 null 值、数字/字符串混排场景。
示例片段:
注意
必须显式声明为
,否则 JSON 中的
会导致
字段名大小写必须和 JSON key 完全一致(默认区分大小写),否则值为
接口返回 List
JsonConvert.DeserializeObjectArgumentException: Type 'System.Data.DataTable' does not have a default constructorDataTableJsonConvert.DeserializeObject(json) JArrayList> DataTableDataTable.LoadDataReadervar json = "[{ \"id\": 1, \"name\": \"Alice\", \"age\": null }]";
var rows = JsonConvert.DeserializeAnonymousType(json, new[] { new { id = 0, name = "", age = (int?)null } });
var dt = new DataTable();
dt.Columns.Add("id", typeof(int));
dt.Columns.Add("name", typeof(string));
dt.Columns.Add("age", typeof(int?));
foreach (var r in rows) {
dt.Rows.Add(r.id, r.name, r.age);
}ageint?nullInvalidCastExceptionDBNull.Value