提问者:小点点

在WindowsForms中从api下载的JSON的问题


我有一个从bank API下载JSON的问题。我在做自动取款机。

        private void get_response()
    {
        WebClient wp = new WebClient();
        string url = "http://api.nbp.pl/api/exchangerates/tables/a/?format=json";
        var response = wp.DownloadString(url);
        var jsonData = System.Text.Json.JsonSerializer.Deserialize<List<Rootobject>>(response);
        Console.WriteLine(jsonData[0].rates.ToString());//ATM.Rates+Rate[]
        Console.WriteLine(jsonData[0].rates[1].currency.ToString());//USD Dolar
        get_data(response);
    }

我找了很多,但我没有找到我的问题的答案。我只需要使用List,但我不知道如何使用它并将其再次转换为json,只知道rates表。我的班级:

        public class Rootobject
    {
        public Class1[] Property1 { get; set; }
    }

    public class Class1
    {
        public string table { get; set; }
        public string no { get; set; }
        public string effectiveDate { get; set; }
        public Rate[] rates { get; set; }
    }

    public class Rate
    {
        public string currency { get; set; }
        public string code { get; set; }
        public float mid { get; set; }
    }

我需要在我的应用程序中显示率表,但我不知道如何在JSON字符串中输入率值,因为当我显示响应时,这会发生。

        private void get_data(string response)
    {
        dataGridView.Rows.Clear();
        DataTable dataTable = (DataTable)JsonConvert.DeserializeObject(response, (typeof(DataTable)));
        dataGridView.DataSource = dataTable;
    }


共1个答案

匿名用户

json是:

[
    {
        "table": "A",
        "no": "083/A/NBP/2021",
        "effectiveDate": "2021-04-30",
        "rates": [
            {
                "currency": "bat (Tajlandia)",
                "code": "THB",
                "mid": 0.1211
            },
            {
                "currency": "dolar amerykański",
                "code": "USD",
                "mid": 3.7746
            },
            (...)
     }
]

它是一个包含单个对象的数组。下面是我的映射:

public class RateData
{
    public List<Rate> Rates {get; set;}
}

public class Rate
{
    public string Currency { get;set;}
    public string Code {get; set;}
    public decimal Mid {get; set;}
}

测试代码:

var options = new JsonSerializerOptions {
    PropertyNameCaseInsensitive = true
};
var list = JsonSerializer.Deserialize<List<RateData>>(json, options);

var single = list.Single(); // throws if there are more
foreach(var rate in single.Rates)
{
    Console.WriteLine($"{rate.Currency}, {rate.Code}, {rate.Mid}");
}

输出:

bat (Tajlandia), THB, 0.1211
dolar amerykański, USD, 3.7746
dolar australijski, AUD, 2.9323
dolar Hongkongu, HKD, 0.4862
...

如何将列表转换为DataTable

但我认为这可能行得通:

dataGridView.DataSource = single.Rates;

如果不是,那么我认为这是可行的:

var data = single.Rates
    .Select( r => new { 
        Currency = r.Currency, 
        Code = r.Code, 
        Mid = r.Mid
        });
dataGridView.DataSource = data;

(基于绑定对象DataGridView C#)