JSON反序列化DataTable时出现StartObject错误求助
解决JSON反序列化为DataTable的嵌套对象错误
错误原因
- 你的JSON是单个对象,而
JsonConvert.DeserializeObject<DataTable>默认期望的是JSON数组(对应DataTable的多行数据集合)。 - 即使将JSON转为数组,
NamePreferences是嵌套对象,DataTable无法直接将嵌套对象映射为表格列,这是触发错误的核心原因。
解决方法
方法1:将嵌套对象字段展开到DataTable列中
先定义与JSON结构匹配的实体类,通过实体中转实现DataTable转换:
- 定义实体类:
public class NamePreferences { public string Dntst { get; set; } public string Hygntst { get; set; } } public class Person { public int Id { get; set; } public string Name1 { get; set; } public string Name2 { get; set; } public string PName { get; set; } public string Address1 { get; set; } public string Address2 { get; set; } public NamePreferences NamePreferences { get; set; } }
- 反序列化并转换为DataTable:
// 反序列化为单个实体 var person = JsonConvert.DeserializeObject<Person>(jsonContent); // 包装为列表后转JSON数组,再反序列化为DataTable var personList = new List<Person> { person }; DataTable dataTable = JsonConvert.DeserializeObject<DataTable>(JsonConvert.SerializeObject(personList));
转换后DataTable会包含Id、Name1、Name2、PName、Address1、Address2、Dntst、Hygntst这些列,嵌套对象的字段会被展开。
方法2:将嵌套对象转为JSON字符串存入DataTable列
如果需要保留NamePreferences的嵌套结构,可先将其转为JSON字符串,再调整JSON为数组格式:
- 修改后的JSON结构(注意外层加数组包裹,嵌套对象转为字符串):
[ { "Id": 1, "Name1": "Test1", "Name2": null, "PName": "PT", "Address1": "First", "Address2": "Second", "NamePreferences": "{\"Dntst\": \"Test1\", \"Hygntst\": \"Test2\"}" } ]
- 直接反序列化为DataTable:
DataTable data = JsonConvert.DeserializeObject<DataTable>(modifiedJsonContent);
此时DataTable会有一个NamePreferences列,存储的是嵌套对象的JSON字符串。
内容的提问来源于stack exchange,提问作者Sami In
相关产品推荐
相关产品推荐

