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

JSON反序列化DataTable时出现StartObject错误求助

解决JSON反序列化为DataTable的嵌套对象错误

错误原因

  • 你的JSON是单个对象,而JsonConvert.DeserializeObject<DataTable>默认期望的是JSON数组(对应DataTable的多行数据集合)。
  • 即使将JSON转为数组,NamePreferences是嵌套对象,DataTable无法直接将嵌套对象映射为表格列,这是触发错误的核心原因。

解决方法

方法1:将嵌套对象字段展开到DataTable列中

先定义与JSON结构匹配的实体类,通过实体中转实现DataTable转换:

  1. 定义实体类:
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; }
}
  1. 反序列化并转换为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为数组格式:

  1. 修改后的JSON结构(注意外层加数组包裹,嵌套对象转为字符串):
[
    {
        "Id": 1,
        "Name1": "Test1",
        "Name2": null,
        "PName": "PT",
        "Address1": "First",
        "Address2": "Second",
        "NamePreferences": "{\"Dntst\": \"Test1\", \"Hygntst\": \"Test2\"}"
    }
]
  1. 直接反序列化为DataTable:
DataTable data = JsonConvert.DeserializeObject<DataTable>(modifiedJsonContent);

此时DataTable会有一个NamePreferences列,存储的是嵌套对象的JSON字符串。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 18:55:18