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

时间:2017-03-19 00:56:29

标签: c# api xamarin.forms async-await vk

我需要将国家/地区的标题从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 countryNameenter image description here

1 个答案:

答案 0 :(得分:2)

正如您所看到的,VK API会返回一个对象数组。 您的 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;

从代码的角度来看,我建议给变量,类和类型赋予适当的名称,以提高代码的可读性和清洁度。最重要的是,我没有看到单独的 响应 类的重点。例如,您可以重命名 类,并将其命名为 国家/地区 。您需要拥有的只是国家列表。此外,由于您使用的是 异步 方法,因此您希望使用 在 中处理退货对于 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时,我建议使用不可变对象(国家/地区列表肯定是静态的,除非某种应用程序逻辑需要您更新国家/地区的名称)。 显然,您可能希望添加可空性检查和不同的验证。