新手求助:如何将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
相关产品推荐
相关产品推荐

