我需要将国家/地区的标题从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; }
}
}
答案 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时,我建议使用不可变对象(国家/地区列表肯定是静态的,除非某种应用程序逻辑需要您更新国家/地区的名称)。 显然,您可能希望添加可空性检查和不同的验证。