【问题标题】:How to parse Riot Games API response如何解析 Riot Games API 响应
【发布时间】:2016-12-10 18:33:35
【问题描述】:

我正在尝试使用 Xamarin 和 Riot Games API 制作一个简单的应用程序。我无法访问召唤师信息。由于我认为我的反序列化方式,它只适用于我的用户名。

这是我的代码:

public async void GetSummonerInformation()
{
     using (var client = new HttpClient())
     {
     var result = await client.GetStringAsync(url);
     var res = JsonConvert.DeserializeObject<RootObject>(result);
     sumName = res.psychoal3x.name;
     }

}
public class Psychoal3x
{
    public int id { get; set; }
    public string name { get; set; }
    public int profileIconId { get; set; }
    public int summonerLevel { get; set; }
    public long revisionDate { get; set; }
}

public class RootObject
{
    public Psychoal3x psychoal3x { get; set; }
}

问题是,如果我将用户名更改为其他名称,它将无法工作,因为它将在 RootObject 类中搜索 psychoal3x。有谁知道如何解决这个问题?

编辑

好的,所以我稍微更改了代码,这就是它的样子

这是修改后的代码

  try
        {
            using (var httpClient = new HttpClient())
            {
                HttpResponseMessage response = httpClient.GetAsync(url).Result;
                response.EnsureSuccessStatusCode();
                string result = response.Content.ReadAsStringAsync().Result;
                var data = JsonConvert.DeserializeObject<Dictionary<string, SummonerDto>>(result);
                var name1 = data.First().Value.name;
                var id = data.First().Value.id;
                var profileIconId1 = data.First().Value.profileIconId;
                var revisionDate1 = data.First().Value.revisionDate;
                sumId = id;
                sumProfileIconId = profileIconId1;
                sumRevisionDate = revisionDate1;
                System.Diagnostics.Debug.WriteLine("{0} this is the  {1}", data.First().Value.name, data.First().Value.profileIconId);
            }
        }catch(Exception ex)
        { System.Diagnostics.Debug.WriteLine(ex.Message); }
    public class SummonerDto
    {
        public int id { get; set; }
        public string name { get; set; }
        public int profileIconId { get; set; }
        public int summonerLevel { get; set; }
        public long revisionDate { get; set; }

    }

其中 sumName 是调用 api 时更改的帐户名称。

【问题讨论】:

标签: c# json xamarin


【解决方案1】:

您已经很接近了,但不要将用户名硬编码到您的模型类中。假设你调用的 API 是 this one,我推荐这样的结构:

public class SummonerDto
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int ProfileIconId { get; set; }
    public int SummonerLevel { get; set; }
    public long RevisionDate { get; set; }
}

根据 API 文档,返回类型是 Dictionary&lt;string, SummonerDto&gt;。您可以使用 JSON.NET 轻松反序列化:

var data = JsonConvert.DeserializeObject<Dictionary<string, SummonerDto>>(result);

这意味着会有一个键值对,键为"psychoal3x" 和一个SummonerDto 对象作为值。可以使用First()获取第一个返回值:

var summoner = data.First().Value;

从那里,您可以访问所有属性,例如Name

这是一个基于您在 cmets 中发布的 JSON 数据的工作小提琴:https://dotnetfiddle.net/xEUXa6

【讨论】:

  • 您好,我认为这不是我正在寻找的解决方案。首先,它在数据 [0] 中给出错误。名称不能将 int 转换为字符串。其次,这不能解决(我认为)我在使用不同帐户名时遇到的问题。这是调用api时返回的json:{ "psychoal3x":{ "id":36564871, "name":"PsychoAl3x", "profileIconId":1394, "summonerLevel":30, "revisionDate":1481230226000 } }问题是我想搜索不同的用户名,但它只能搜索psychal3x。
  • 我想我修好了!在下面查看我的答案
  • @AlexTselikas 我在回答中解决了一个问题 - 这对你有用吗?
  • 不幸的是你的不起作用。我必须导入 System.Linq 才能识别 First() 但我无法添加我的属性。我只能输入 Equals、GetHashCode、GetType、Key、ToString和 data.First() 之后的值。
  • @AlexTselikas 对不起,我搞砸了语法。我需要更多的咖啡 :) 固定!
猜你喜欢
  • 1970-01-01
  • 2023-02-04
  • 2014-08-16
  • 1970-01-01
  • 2019-02-08
  • 2019-02-27
  • 1970-01-01
  • 2019-12-11
  • 1970-01-01
相关资源
最近更新 更多