我要做的是采取我的。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数据以后,但我只是试图做这个一步。
这是一个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:UsersAnaseDesktopVisual CKMAPKMAPbinReleasecelestialbodydata.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);
}
它比我见过的许多其他东西简单得多。困难的部分将是获取它,当你点击组合框中的一个项目时,它会在数组中搜索那个名称,然后获取相邻的质量或半径值并用那个替换组合框的文本。我不熟悉循环和数组