API返回JSON表对象数组反序列化失败问题咨询
问题分析与解决方案
你遇到反序列化返回null的问题,核心原因有两个:
- 类结构完全不匹配JSON层级:你的
DataConvert类直接定义了Data[] data,但原始JSON最外层是包含tables数组的对象,两者结构完全不对等,序列化器找不到对应字段,自然返回null。 - 字段拼写错误:
Data类里的daat2应该是data2,就算结构匹配,这个拼写错误也会导致该字段无法正确赋值。
第一步:创建匹配原始JSON结构的类
要先正确解析原始JSON,你需要定义对应层级的类:
// 最外层根对象,对应JSON的顶级结构 public class RootObject { public List<Table> tables { get; set; } } // 对应JSON中tables数组的每个元素 public class Table { public string name { get; set; } public List<Column> columns { get; set; } public List<List<string>> rows { get; set; } } // 对应columns数组的每个元素 public class Column { public string name { get; set; } public string type { get; set; } } // 修正拼写后的目标数据类 public class Data { public string data1 { get; set; } public string data2 { get; set; } // 修正了daat2的拼写错误 public string data3 { get; set; } }
第二步:反序列化后手动映射到Data对象数组
原始JSON中的rows是二维字符串数组,不是直接的Data对象数组,所以需要手动将每行数据映射到Data实例:
// 先反序列化到RootObject var root = JsonConvert.DeserializeObject<RootObject>(json); // 找到PrimaryResult表(假设你只需要这个表的数据) var primaryTable = root.tables.FirstOrDefault(t => t.name == "PrimaryResult"); if (primaryTable == null) { // 处理表不存在的情况 return null; } // 将rows映射到Data数组 var dataList = new List<Data>(); foreach (var row in primaryTable.rows) { var data = new Data(); // 根据columns的顺序对应赋值 data.data1 = row[0]; data.data2 = row[1]; data.data3 = row[2]; dataList.Add(data); } // 最终得到目标Data数组 Data[] dataArray = dataList.ToArray();
更灵活的映射方式(适配columns顺序变化)
如果columns的顺序可能变动,你可以通过列名与索引的对应关系来映射,避免硬编码索引:
// 创建列名到索引的字典 var columnIndexMap = primaryTable.columns.Select((col, index) => new { col.name, index }) .ToDictionary(x => x.name, x => x.index); var dataList = new List<Data>(); foreach (var row in primaryTable.rows) { var data = new Data(); data.data1 = row[columnIndexMap["data1"]]; data.data2 = row[columnIndexMap["data2"]]; data.data3 = row[columnIndexMap["data3"]]; dataList.Add(data); }
这种方式鲁棒性更强,就算columns的顺序调整,也能正确完成字段赋值。
内容的提问来源于stack exchange,提问作者Kertix
相关产品推荐
相关产品推荐

