1

I'm trying to work with the league of legends api to get a list of champions from [1]http://ddragon.leagueoflegends.com/cdn/6.24.1/data/en_GB/champion.json[1]: http://ddragon.leagueoflegends.com/cdn/6.24.1/data/en_GB/champion.json

this returns json like

    {
  "type": "champion",
  "format": "standAloneComplex",
  "version": "6.24.1",
  "data": {
    "Aatrox": {
      "version": "6.24.1",
      "id": "Aatrox",
      "key": "266",
      "name": "Aatrox",
      "title": "the Darkin Blade",
      "blurb": "Aatrox is a legendary warrior, one of only five that remain of an ancient race known as the Darkin. He wields his massive blade with grace and poise, slicing through legions in a style that is hypnotic to behold. With each foe felled, Aatrox's ...",
      "info": {
        "attack": 8,
        "defense": 4,
        "magic": 3,
        "difficulty": 4
      },
      "image": {
        "full": "Aatrox.png",
        "sprite": "champion0.png",
        "group": "champion",
        "x": 0,
        "y": 0,
        "w": 48,
        "h": 48
      },
      "tags": [
        "Fighter",
        "Tank"
      ],
      "partype": "BloodWell",
      "stats": {
        "hp": 537.8,
        "hpperlevel": 85,
        "mp": 105.6,
        "mpperlevel": 45,
        "movespeed": 345,
        "armor": 24.384,
        "armorperlevel": 3.8,
        "spellblock": 32.1,
        "spellblockperlevel": 1.25,
        "attackrange": 150,
        "hpregen": 6.59,
        "hpregenperlevel": 0.5,
        "mpregen": 0,
        "mpregenperlevel": 0,
        "crit": 0,
        "critperlevel": 0,
        "attackdamage": 60.376,
        "attackdamageperlevel": 3.2,
        "attackspeedoffset": -0.04,
        "attackspeedperlevel": 3
      }
    },
    "Ahri": {
      "version": "6.24.1",
      "id": "Ahri",
      "key": "103",
      "name": "Ahri",
      "title": "the Nine-Tailed Fox",
      "blurb": "Unlike other foxes that roamed the woods of southern Ionia, Ahri had always felt a strange connection to the magical world around her; a connection that was somehow incomplete. Deep inside, she felt the skin she had been born into was an ill fit for ...",
      "info": {
        "attack": 3,
        "defense": 4,
        "magic": 8,
        "difficulty": 5
      },
      "image": {
        "full": "Ahri.png",
        "sprite": "champion0.png",
        "group": "champion",
        "x": 48,
        "y": 0,
        "w": 48,
        "h": 48
      },
      "tags": [
        "Mage",
        "Assassin"
      ],
      "partype": "MP",
      "stats": {
        "hp": 514.4,
        "hpperlevel": 80,
        "mp": 334,
        "mpperlevel": 50,
        "movespeed": 330,
        "armor": 20.88,
        "armorperlevel": 3.5,
        "spellblock": 30,
        "spellblockperlevel": 0,
        "attackrange": 550,
        "hpregen": 6.505,
        "hpregenperlevel": 0.6,
        "mpregen": 6,
        "mpregenperlevel": 0.8,
        "crit": 0,
        "critperlevel": 0,
        "attackdamage": 53.04,
        "attackdamageperlevel": 3,
        "attackspeedoffset": -0.065,
        "attackspeedperlevel": 2
      }
    },
    "Akali": {
      "version": "6.24.1",
      "id": "Akali",
      "key": "84",
      "name": "Akali",
      "title": "the Fist of Shadow",
      "blurb": "There exists an ancient order originating in the Ionian Isles dedicated to the preservation of balance. Order, chaos, light, darkness -- all things must exist in perfect harmony for such is the way of the universe. This order is known as the Kinkou ...",
      "info": {
        "attack": 5,
        "defense": 3,
        "magic": 8,
        "difficulty": 7
      },
      "image": {
        "full": "Akali.png",
        "sprite": "champion0.png",
        "group": "champion",
        "x": 96,
        "y": 0,
        "w": 48,
        "h": 48
      },
      "tags": [
        "Assassin"
      ],
      "partype": "Energy",
      "stats": {
        "hp": 587.8,
        "hpperlevel": 85,
        "mp": 200,
        "mpperlevel": 0,
        "movespeed": 350,
        "armor": 26.38,
        "armorperlevel": 3.5,
        "spellblock": 32.1,
        "spellblockperlevel": 1.25,
        "attackrange": 125,
        "hpregen": 8.34,
        "hpregenperlevel": 0.65,
        "mpregen": 50,
        "mpregenperlevel": 0,
        "crit": 0,
        "critperlevel": 0,
        "attackdamage": 58.376,
        "attackdamageperlevel": 3.2,
        "attackspeedoffset": -0.1,
        "attackspeedperlevel": 3.1
      }
    },
...

I should be able to deserialize this like:

 class ChampionService : BaseService
{
    public List<Champion> GetChampions()
    {
        HttpWebRequest req = CreateRequest(ApiUrl);
        HttpWebResponse res = (HttpWebResponse)req.GetResponse();
        string json;

        using (StreamReader reader = new StreamReader(res.GetResponseStream()))
        {
            json = reader.ReadToEnd();
            return JsonConvert.DeserializeObject<List<Champion>>(json);
        }
    }
}

If data were an array, my Champion class:

public class Champion
{
    [JsonProperty("name")]
    public string Name { get; set; }
    [JsonProperty("key")]
    public int Key { get; set; }
    [JsonProperty("tags")]
    public List<string> tags { get; set; }
}

However because the api returns the data object containing more objects it cannot be treated like an array and so this wont work. Is there a good way to make this work?

1
  • Refer my answer here to create a class from the JSON you have. Then deserialize to that class. Commented Apr 11, 2017 at 21:40

1 Answer 1

4

You can model the JSON differently by having a class that's a place holder for the champions dictionary:

class ApiResult
{
    [JsonProperty("data")]
    public Dictionary<string, Champion> Champions { get; set; }
}

And then to deserialize, you would do:

var result = JsonConvert.DeserializeObject<ApiResult>(json);

You could later retrieve a List of the champions by using the ToList() method on the Champions dictionary.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.