如何基于JSON数据在WinForms中创建TreeView
解决WinForms中基于JSON数据构建TreeView的问题
你遇到的解析错误根源是原始JSON里的stock格式不符合JSON规范——JSON对象必须是键值对结构,但你写的stock里直接放了字符串列表,这会让JSON.Net无法正确解析。先把JSON修正成合法格式,然后我们一步步实现TreeView的加载:
第一步:修正你的JSON数据
把stock从无效的对象改成数组(因为它本质是一个库存列表),修正后的JSON如下:
{ "cars": [ { "code": "MB-GLS", "name": "Mercedes-Benz GLS 350 d 4MATIC", "stock": ["AMG 9G-Tronic 2016 Blue", "4M AMG 2017 Black"] }, { "code": "BM-420D", "name": "BMW 420d Cabrio", "stock": ["420d Cabrio Luxury Line 2015 White", "M Sport 420d Cabrio Red 2018", "420d Cabrio Premium 2014 Black", "420d Cabrio Premium 2015 White"] }, { "code": "AU-A5", "name": "A5 Sportback 2.0 TDI quattro", "stock": ["2.0 TDI quattro Dynamic 2018 Grey", "2.0 TDI quattro S-Line 2018 Black", "2.0 TDI quattro S-Line 2018 Indigo", "2.0 TDI quattro Design 2017 White", "2.0 TDI quattro Design 2016 Black"] }, { "code": "TS-MOS", "name": "Tesla Model S", "stock": ["Model S 75D 525 PS 2018 White", "Model S 75D 525 PS 2018 Indigo", "Model S 90D 2017 Red", "Model S P100D 775 PS 2018 Smoke-Colored", "Model S P100D 775 PS 2018 White", "Model S P85+ 2013 Blue"] } ] }
第二步:创建C#模型类
为了方便解析,我们创建对应的实体类,用JSON.Net的特性来映射字段:
using Newtonsoft.Json; public class CarInventory { [JsonProperty("cars")] public List<Car> Cars { get; set; } } public class Car { [JsonProperty("code")] public string Code { get; set; } [JsonProperty("name")] public string Name { get; set; } [JsonProperty("stock")] public List<string> Stock { get; set; } }
第三步:编写TreeView加载代码
首先确保你已经通过NuGet安装了JSON.Net(搜索Newtonsoft.Json包并安装)。然后在窗体的加载事件中编写以下代码:
private void Form1_Load(object sender, EventArgs e) { // 读取JSON数据:可以是直接写的字符串,也可以从文件读取 string jsonContent = @"上面修正后的JSON字符串"; // 如果从文件读取:string jsonContent = File.ReadAllText(@"你的JSON文件路径"); // 解析JSON到模型对象 var carInventory = JsonConvert.DeserializeObject<CarInventory>(jsonContent); // 清空TreeView并添加根节点 treeView1.Nodes.Clear(); TreeNode rootNode = treeView1.Nodes.Add("Cars"); // 遍历每辆车,构建树形结构 foreach (Car car in carInventory.Cars) { // 创建车辆节点,显示编码+名称 TreeNode carNode = rootNode.Nodes.Add($"{car.Code} - {car.Name}"); // 添加该车辆的所有库存项作为子节点 foreach (string stockItem in car.Stock) { carNode.Nodes.Add(stockItem); } } // 可选:展开所有节点,方便查看 treeView1.ExpandAll(); }
特殊情况:无法修改原始JSON怎么办?
如果因为某些限制你不能修改原始的不规范JSON,可以用JObject手动解析:
private void Form1_Load(object sender, EventArgs e) { string jsonContent = @"你的原始不规范JSON字符串"; JObject jObject = JObject.Parse(jsonContent); treeView1.Nodes.Clear(); TreeNode rootNode = treeView1.Nodes.Add("Cars"); foreach (JToken carToken in jObject["cars"]) { string code = carToken["code"].ToString(); string name = carToken["name"].ToString(); TreeNode carNode = rootNode.Nodes.Add($"{code} - {name}"); // 提取stock对象中的所有值(忽略无效的键结构) IEnumerable<string> stockItems = carToken["stock"].Values<string>(); foreach (string item in stockItems) { carNode.Nodes.Add(item); } } treeView1.ExpandAll(); }
不过还是强烈建议修正JSON格式,这样代码更清晰、更易维护,也符合JSON的标准规范。
内容的提问来源于stack exchange,提问作者Jack Eagle




