如何从.json文件中获取数据,仅使用其中的一些项,并用该数据填充组合框?

本文关键字:数据 填充 组合 获取 json 文件 | 更新日期: 2023-09-27 18:17:43

我要做的是采取我的。json文件,只从该文件中抓取某些项目,然后用过滤的数据(使用Newtonsoft/Json.net)填充组合框中的项目。我给你举个例子:

(部分)JSON文件数据:

[
  {
    "name": "Kerbol",
    "radius": 261600000,
    "mass": 1.7565670e+28
  },
  {
    "name": "Moho",
    "radius": 250000,
    "mass": 2.5263617e+21
  },
  {
    "name": "Eve",
    "radius": 700000,
    "mass": 1.2244127e+23
  },
]

这不是所有的数据,只是其中的一部分。这是游戏"Kerbal Space Program"中关于行星的一些信息。我现在唯一感兴趣的是抓取.json文件中的每个"name"项。然后,我想用所有这些名称填充组合框中的items属性(在每行上)。

我已经尝试了很多其他的代码来过滤它,但我不太理解重写它以满足我的需要。

编辑:我想做更多与这个。json数据以后,但我只是试图做这个一步。

如何从.json文件中获取数据,仅使用其中的一些项,并用该数据填充组合框?

这是一个wpf演示,我已经在我的电脑上测试过了,你可以试试。

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        var data = MyModel.getTestData();
        var dataStr = JsonConvert.SerializeObject(data, Formatting.Indented);
        using (var writer = new StreamWriter(@"d:'data.json", false))
        {
            writer.Write(dataStr);
        }
        using (var reader = new StreamReader(@"d:'data.json"))
        {
            var recs = JsonConvert.DeserializeObject<List<MyModel>>(reader.ReadToEnd());
            cbx.ItemsSource = recs;//cbx is ComboBox
            cbx.DisplayMemberPath = "name";
            cbx.SelectedIndex = 0;
        }
    }
}
public class MyModel
{
    public string name { get; set; }
    public double radius { get; set; }
    public double  mass  { get; set; }
    public static List<MyModel> getTestData()
    {
        return new List<MyModel>
        {
            new MyModel {name = "x1", radius = 1, mass = 1},
            new MyModel {name = "x2", radius = 2, mass = 2},
            new MyModel {name = "x3", radius = 3, mass = 3},
            new MyModel {name = "x4", radius = 4, mass = 4},
        };
    }
}

我设法在Discord上找到了一些我可以交谈的人,这对我有很大帮助。我所看到的几乎每一段代码都对我没有帮助,因为我对它的理解不足以挽救它。这就是最终的结果:

celestialbodydata.cs

using System;
namespace KMAP
{
    class CelestialBodyData
    {
        public string name { get; protected set; }
        public double radius { get; protected set; }
        public double mass { get; protected set; }
        public CelestialBodyData(string name, double radius, double mass)
        {
            this.name = name;
            this.radius = radius;
            this.mass = mass;
        }
    }
}

主要Form.cs:

private void Form1_Load(object sender, EventArgs e)
{
    SemMajAxTab_InputBodyRadius_ComboBox.Items.Clear();
    OPTab_InputBodyMass_ComboBox.Items.Clear();
    OPTab_InputBodyMass2_ComboBox.Items.Clear();
    OPTab_InputBodyRadius_ComboBox.Items.Clear();
    HohTab_InputBodyMass_ComboBox1.Items.Clear();
    HohTab_InputBodyRadius_ComboBox1.Items.Clear();
    HohTab_InputBodyMass_ComboBox2.Items.Clear();
    HohTab_InputBodyRadius_ComboBox4.Items.Clear();
    CelestialBodyData[] celestialbodydata_Array = JsonConvert.DeserializeObject<CelestialBodyData[]>(File.ReadAllText(@"C:'Users'Anase'Desktop'Visual C'KMAP'KMAP'bin'Release'celestialbodydata.json"));
    string[] namesarray = new string[celestialbodydata_Array.Length];
    for (int i = 0; i < celestialbodydata_Array.Length; i++)
    {
        namesarray[i] = (celestialbodydata_Array[i].name).ToString();
    }
    SemMajAxTab_InputBodyRadius_ComboBox.Items.AddRange(namesarray);
    OPTab_InputBodyMass_ComboBox.Items.AddRange(namesarray);
    OPTab_InputBodyMass2_ComboBox.Items.AddRange(namesarray);
    OPTab_InputBodyRadius_ComboBox.Items.AddRange(namesarray);
    HohTab_InputBodyMass_ComboBox1.Items.AddRange(namesarray);
    HohTab_InputBodyRadius_ComboBox1.Items.AddRange(namesarray);
    HohTab_InputBodyMass_ComboBox2.Items.AddRange(namesarray);
    HohTab_InputBodyRadius_ComboBox4.Items.AddRange(namesarray);
}

它比我见过的许多其他东西简单得多。困难的部分将是获取它,当你点击组合框中的一个项目时,它会在数组中搜索那个名称,然后获取相邻的质量或半径值并用那个替换组合框的文本。我不熟悉循环和数组