C#中如何创建适配指定JSON的可按LineID索引的类?
适配动态键名JSON的C#类设计方案
问题背景
原始JSON的lines字段是一个以动态字符串(如"0010"、"0020")为键的对象,每个键对应的数据结构完全一致。用Visual Studio的“粘贴特殊/从JSON生成类”功能会生成大量重复的类(如_0010、_0020),无法通过Lines[LineId]的方式直接索引数据,实用性极低。同时JSON中还有包含LineID字段的lineSummary数组,需要实现按LineID快速访问对应行数据的需求,且不能修改原始JSON结构。
解决方案
1. 定义通用行数据类
先写一个统一的类来描述每一行的结构,替代自动生成的多个重复类:
public class LineData { public string ProvCountyCode { get; set; } public string ProvNo { get; set; } public string ParNonparCode { get; set; } public string ParNonparCode2 { get; set; } }
2. 用字典替代静态类结构
把原本的Lines类替换为Dictionary<string, LineData>,这样就能直接通过LineID(也就是JSON里的键名,比如"0010")索引对应数据。同时包含lineSummary的根类示例如下:
public class RootObject { public Dictionary<string, LineData> lines { get; set; } public List<LineSummary> lineSummary { get; set; } } public class LineSummary { public string LineID { get; set; } // 这里补充lineSummary里的其他字段,按实际JSON结构来 }
3. 序列化与反序列化处理
不管用Newtonsoft.Json还是System.Text.Json,这种字典结构都能自动匹配原始JSON的动态键格式:
Newtonsoft.Json示例
var jsonContent = "你的JSON内容字符串"; var rootObj = JsonConvert.DeserializeObject<RootObject>(jsonContent); // 通过LineID直接获取数据 var targetLine = rootObj.lines["0010"]; Console.WriteLine(targetLine.ProvNo);
System.Text.Json示例
var serializeOptions = new JsonSerializerOptions { PropertyNameCaseInsensitive = true // 忽略字段大小写匹配,避免大小写问题 }; var rootObj = JsonSerializer.Deserialize<RootObject>(jsonContent, serializeOptions); // 访问指定LineID的数据 var targetLine = rootObj.lines["0020"];
4. 结合lineSummary批量处理
如果要通过lineSummary里的LineID批量访问数据,用字典的TryGetValue方法可以避免键不存在的异常:
foreach (var summary in rootObj.lineSummary) { if (rootObj.lines.TryGetValue(summary.LineID, out var lineData)) { // 处理获取到的lineData Console.WriteLine($"Line {summary.LineID} 所属地区编码: {lineData.ProvCountyCode}"); } }
内容的提问来源于stack exchange,提问作者Mark Ainsworth
相关产品推荐
相关产品推荐

