简体   繁体   中英

c# deserializing JSON web api response

I need a little help from somebody who can tell me where my mistake is.
I have an API which returns JSON code:

{"block4o": {
   "id": 20153910,
   "name": "Block4o",
   "profileIconId": 616,
   "revisionDate": 1408967362000,
   "summonerLevel": 30
}}

I tried to desearialize it but without success. I am using NewtonSoft.Json from NuGet. Here is my code:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Net;
using Newtonsoft.Json;

namespace ConsoleApplication37
{
    class Program
    {

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

        static void Main()
        {
            WebRequest request = WebRequest.Create(
              "https://eune.api.pvp.net/api/lol/eune/v1.4/summoner/by-name/Block4o?api_key=****");
            request.Credentials = CredentialCache.DefaultCredentials;
            WebResponse response = request.GetResponse();
            Stream dataStream = response.GetResponseStream();
            StreamReader reader = new StreamReader(dataStream);
            string responseFromServer = reader.ReadToEnd();
            Console.WriteLine(responseFromServer);
            reader.Close();
            response.Close();
            Console.ReadKey();

            MyData tmp = JsonConvert.DeserializeObject<MyData>(responseFromServer);
            Console.WriteLine("{0}",tmp.id);
            Console.ReadKey();
        }

    }
}

PS It works if the response is like this:

{
   "id": 20153910,
   "name": "Block4o",
   "profileIconId": 616,
   "revisionDate": 1408967362000,
   "summonerLevel": 30
}

您需要指定json的哪个属性对应于您的模型。

MyData tmp = JsonConvert.DeserializeObject<MyData>((JObject.Parse(responseFromServer)["block4o"]).ToString());

If you define the class

public class Response
{
  public MyData Block4o { get; set; }
}

and deserialize as Response, you should get the desired result.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM