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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.01 13:08:12