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

新手求助:如何将JSON字符串转换为C# DataTable并修复代码错误

解决将单个JSON对象转换为C# DataTable的问题

嘿,我来帮你搞定这个代码问题!首先咱们得先搞清楚你遇到的问题根源:

问题分析

你拿到的REST API返回的是单个JSON对象,而不是包含Value字段的嵌套结构,所以你用jsonObject.Value的时候自然会报错——这个JSON里根本没有叫Value的属性!另外,JsonConvert.DeserializeObject<DataTable>()默认期望的是JSON数组(也就是多条数据的集合),直接反序列化单个对象也会出问题。

修复方案

这里给你两种可行的解决办法:

方法1:将单个对象包装为JSON数组后反序列化

这种方法最简单,只需要把你的JSON字符串用[]包裹起来,让它变成一个只包含一条数据的数组,再反序列化成DataTable:

string jsonContent = @"{""odata.metadata"":""https://ABC.XYZ.com/ERP10TESTNSSO/api/v1/Erp.BO.ABCCodeSvc/$metadata#Epicor.RestApi.ABCCodes/@Element"",""Company"":""93100"",""ABCCode1"":""A"",""CountFreq"":1,""ExcludeFromCC"":false,""StockValPcnt"":""0"",""PcntTolerance"":""0.00"",""CalcPcnt"":false,""CalcQty"":false,""CalcValue"":false,""QtyTolerance"":""0"",""ValueTolerance"":""0"",""ShipToCustNum"":0,""SysRevID"":""6066188743"",""SysRowID"":""5b7e2172-7f7a-445e-983d-f230e050153d"",""BitFlag"":0,""RowMod"":""""}";

// 把单个对象包装成JSON数组
string jsonArray = $"[{jsonContent}]";

// 反序列化为DataTable
DataTable dt = JsonConvert.DeserializeObject<DataTable>(jsonArray);

方法2:先反序列化为实体类,再手动填充DataTable

如果你需要更灵活的控制(比如筛选字段),可以先定义一个和JSON结构匹配的实体类,反序列化后再添加到DataTable中:

第一步:定义实体类

public class ABCCode
{
    public string odata_metadata { get; set; }
    public string Company { get; set; }
    public string ABCCode1 { get; set; }
    public int CountFreq { get; set; }
    public bool ExcludeFromCC { get; set; }
    public string StockValPcnt { get; set; }
    public string PcntTolerance { get; set; }
    public bool CalcPcnt { get; set; }
    public bool CalcQty { get; set; }
    public bool CalcValue { get; set; }
    public string QtyTolerance { get; set; }
    public string ValueTolerance { get; set; }
    public int ShipToCustNum { get; set; }
    public string SysRevID { get; set; }
    public string SysRowID { get; set; }
    public int BitFlag { get; set; }
    public string RowMod { get; set; }
}

第二步:反序列化并填充DataTable

string jsonContent = @"你的JSON字符串";

// 反序列化为实体对象
ABCCode abcCode = JsonConvert.DeserializeObject<ABCCode>(jsonContent);

// 创建DataTable并添加列(可以手动添加,或者用反射自动生成)
DataTable dt = new DataTable();
dt.Columns.Add("odata.metadata", typeof(string));
dt.Columns.Add("Company", typeof(string));
dt.Columns.Add("ABCCode1", typeof(string));
// 这里可以继续添加其他列,或者用反射遍历实体类的属性来自动添加

// 添加行
DataRow row = dt.NewRow();
row["odata.metadata"] = abcCode.odata_metadata;
row["Company"] = abcCode.Company;
row["ABCCode1"] = abcCode.ABCCode1;
// 填充其他字段...
dt.Rows.Add(row);

为什么原来的代码会报错?

你之前用dynamic jsonObject = JsonConvert.DeserializeObject(jsonContent);得到的是一个包含所有JSON属性的动态对象,但这个对象里并没有Value属性,所以访问jsonObject.Value的时候就会抛出运行时错误啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 22:27:44