将国家/地区写入 VK API 的列表

Writing countries to a list from VK API

我需要将来自 VK API 的国家/地区标题写入以下列表 link

我写了一些代码:

public class GettingCountry
{
    public async Task<string> FetchAsync(string url)
    {
        string jsonString;
        using (var httpClient = new System.Net.Http.HttpClient())
        {
            var stream = await httpClient.GetStreamAsync(url);
            StreamReader reader = new StreamReader(stream);
            jsonString = reader.ReadToEnd();
        }

        var readJson = JObject.Parse(jsonString);
        string countryName = readJson["response"]["items"].ToString();
        var deserialized = JsonConvert.DeserializeObject<RootObject>(jsonString);

        return jsonString;
    }
}

public class Item
{
    public int id { get; set; }
    public string title { get; set; }
}

public class Response
{
    public int count { get; set; }
    public List<Item> items { get; set; }
}

public class RootObject
{
    public Response response { get; set; }
}

}

我下了一个断点,进入了string countryName只有这个:

如您所见,VK API return是一个对象数组。 您的 jsonString 包含完整的响应字符串。现在,jsonString["response"]["items"] 包含一个项目数组。

首先需要解析数组,然后解析每一项,像这样:

var readJson = JObject.Parse(jsonString);
JArray countries = JArray.Parse(readJson["response"]["items"]);

var Response listOfCountries = new Response();

foreach (var country in countries) {
    Item currentCountry = new Item();
    currentCountry.id = country.id;
    currentCountry.title = country.title;
    listOfCountries.items.Add(currentCountry);
}

listOfCountries.count = listOfCountries.items.Count;

从代码的角度来看,我建议为变量、classes 和类型赋予适当的名称,以提高代码的可读性和简洁性。最重要的是,我真的不认为有一个单独的 Response class 有什么意义。例如,您可以将 Item class 重命名为 Country。那么您所需要的只是一个国家列表。此外,因为您使用的是 async 方法,所以您想在 中处理 return HttpClient 使用 - 如果不这样做,客户端可能会被丢弃太快了,您可能会开始遇到非常奇怪的错误。像这样:

public class VkCountry
{
    public int Id { get; }
    public string Title { get; }
    public VkCountry(int countryId, string countryTitle) {
        this.Id = countryId;
        this.Title = countryTitle;
    }
}

public async Task<List<VkCountry>> FetchAsync(string url)
{
    string jsonString;
    using (var httpClient = new System.Net.Http.HttpClient())
    {
        var stream = await httpClient.GetStreamAsync(url);
        StreamReader reader = new StreamReader(stream);
        jsonString = reader.ReadToEnd();

        var listOfCountries = new List<VkCountry>();

        var responseCountries = JArray.Parse(JObject.Parse(jsonString)["response"]["items"].ToString());

        foreach (var countryInResponse in responseCountries) {
            var vkCountry = new VkCountry((int)countryInResponse["id"], (string)countryInResponse["title"]);

            listOfCountries.Add(vkCountry);
        }

        return listOfCountries;
    } 
}

你可能会注意到我已经让 VkContry 实现不可变,属性是只读的,可以使用构造函数设置只要。当您使用相对静态的第三方 API 时,我建议使用不可变对象(国家列表绝对是静态的,除非某种应用程序逻辑要求您更新国家名称)。 显然,您可能希望添加可空性检查和不同的验证。