从 VK API 解析大学

Posted

技术标签:

【中文标题】从 VK API 解析大学【英文标题】:Parse universities from VK API 【发布时间】:2017-08-13 21:06:02 【问题描述】:

我需要写信给List<string> 大学名单。我已经将国家和城市写到列表中。但在大学中,数据的表现略有不同。有"response":[201,,我不知道如何处理它。我成功地从here 获得了国家/地区。从here 我需要将大学名称写到List<string>。这是code 我是如何获得国家/地区的。我在城市中使用的类比代码。在尝试执行这一行var universityRepository = new RootObject((int)universityInResponse["id"], (string)universityInResponse["title"]); 时,我遇到了一个未处理的异常。类的完整代码:

public class GettingUniversity

    public static List<RootObject> listOfUniversitiesRoot = new List<RootObject>();//This List contains Id and Titles of universities
    public List<string> listOfUniversities = new List<string>();//list with names of the universities
    private string jsonString; //string for getting data from the url
    public async Task<List<RootObject>> FetchAsync(string url)
    
        //getting data process goes here
        using (var httpClient = new System.Net.Http.HttpClient())
        
            var stream = await httpClient.GetStreamAsync(url);
            StreamReader reader = new StreamReader(stream);
            jsonString = reader.ReadToEnd();
        

        var responseUniversities = JArray.Parse(JObject.Parse(jsonString)["response"].ToString());//parsing data from jsonstring

        foreach (var universityInResponse in responseUniversities)//the foreach-loop
        
            var universityRepository = new RootObject((int)universityInResponse["id"], (string)universityInResponse["title"]);
            //listOfUniversitiesRoot.Add(universityRepository);//adding to the list with names of the universities
            //listOfUniversities.Add(universityRepository.Title);
        

        return listOfUniversitiesRoot;//returned list
    

属性在这里表示:

namespace KoshelnykTestTask

    //Here I have set properties for FetchAsync(string url) to get countries and cities 
    public class RootObject
    
        public int Id  get; set; 
        public string Title  get; set; 
        public RootObject(int Id, string Title)
        
            this.Id = Id;
            this.Title = Title;
        
    

【问题讨论】:

【参考方案1】:

您的问题是返回的 JSON 包含一个多态数组——第一个条目是一个整数,其余的是包含大学信息的对象:


   "response":[
      201,
      
         "id":1096,
         "title":"КПИ им. И. Сикорского"
      ,
      
         "id":1135,
         "title":"НУФВСУ (бывш. КГИФК)"
      ,
      
         "id":1140,
         "title":"КГАВТ им. Конашевича-Сагайдачного"
      ,

在反序列化对象之前需要对整数值进行过滤,可以这样做:

var universityRepository  = JToken.Parse(jsonString)["response"]
    // Filter the integer value by selecting only objects
    .OfType<JObject>()
    // Deserialize each object to a RootObject
    .Select(o => o.ToObject<RootObject>())
    // Return in a List<RootObject>
    .ToList();

var listOfUniversities = universityRepository
    .Select(u => u.Title)
    .ToList();

示例fiddle。

请注意,似乎没有必要将这些列表存储在静态或类变量中——您只需将它们返回给调用者即可。

【讨论】:

以上是关于从 VK API 解析大学的主要内容,如果未能解决你的问题,请参考以下文章

湘潭大学博士研究生入学考试有机合成科目波谱解析部分解答

蓝桥杯Web2022年第十三届蓝桥杯Web大学组国赛真题解析

大学数学专业试题499套及部分解答

大数据解析日本本科留学:超过90%的学生先行入读语言学校

华为中国大学生ICT大赛2021实践赛网络赛道晋级赛试题解析(答案版)

华为中国大学生ICT大赛2021实践赛网络赛道晋级赛试题解析(答案版)