You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何基于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

火山引擎 最新活动