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

时间:2016-11-13 03:04:43

标签: c# arrays json winforms json.net

我要做的就是获取我的.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文件中的项目。然后我想在组合框中填充所有这些名称的items属性(在每一行上)。

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

编辑:我想稍后使用这个.json数据做更多的事情,但我只想尝试一步一步。

EDIT2:这适用于Windows窗体。

2 个答案:

答案 0 :(得分:0)

这是一个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},
        };
    }
}

答案 1 :(得分:0)

我设法在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;
        }
    }
}

Main 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);
}

它比我见过的许多其他东西简单得多。很难获得它,以便当您单击组合框中的项目时,它会在数组中搜索该名称,然后抓取相邻的质量或半径值,并用该替换组合框的文本。我是循环和数组的新手。