Twitch API: bagaimana cara mendapatkan _link?

saya menggunakan Twitch API untuk proyek saya dan saya perlu mengambil nilai _links di: https://api.twitch.tv/kraken/streams/ogaminglol (contoh)

Saya menggunakan kode ini:

WebClient strJson = new WebClient();
string test = strJson.DownloadString("https://api.twitch.tv/kraken/streams/ogaminglol");
DataContractJsonSerializer js = new DataContractJsonSerializer(typeof(Streams));
MemoryStream ms = new MemoryStream(System.Text.ASCIIEncoding.ASCII.GetBytes(test));
Streams stream = (Streams)js.ReadObject(ms);
//label1.Text = "Title : " + stream.game;
ms.Close();

Dan kelas Streams saya yang menerima data

[DataContract]
class Streams
{
    [DataMember]
    public Dictionary<string, string> _links { get; set; }

    [DataMember]
    public string self { get; set; }

    [DataMember]
    public string channel { get; set; }

    [DataMember]
    public Stream stream { get; set; }
}

Self dan channel adalah null karena di https://api.twitch.tv/kraken/streams/ogaminglol mereka ada di bagian "_links". Saya sudah mencoba Kamus tetapi tidak berhasil. Saya harap Anda memahami masalah saya (dan bahasa Inggris saya :p).


person Froelicher    schedule 07.02.2015    source sumber


Jawaban (1)


Ada beberapa masalah di sini, beberapa di antaranya dapat menyebabkan gejala yang Anda jelaskan:

  1. Model data Anda tidak cocok dengan JSON. self adalah properti _links bukan Streams. channel muncul sebagai properti di _links dan stream bukan Streams.

  2. Kelas Anda Streams menyertakan properti DataMember Stream yang merupakan kelas abstrak. Tentu saja ini tidak dapat dideserialisasi. Mungkin Anda lupa memasukkannya ke dalam pertanyaan Anda?

  3. Kamus _links Anda dalam format kamus "sederhana", yaitu DataContractJsonSerializerSettings.UseSimpleDictionaryFormat = true. Anda perlu menggunakan pengaturan ini (hanya .Net 4.5 atau lebih baru), atau beralih ke JavaScriptSerializer atau Json.NET.

  4. Anda menggunakan encoding ASCII yang dibatasi hingga 128 karakter Unicode terendah. Gunakan Encoding.Unicode sebagai gantinya.

  5. WebClient dapat dibuang jadi harus dipakai di dalam pernyataan using.

Untuk memperbaikinya, Anda perlu:

  1. Buka http://json2csharp.com/, posting JSON Anda, dan buatkan kelas untuk Anda, lalu konversikan semua properti _links menjadi public Dictionary<string, string> _links { get; set; }. Anda harus mendapatkan ini:

    public class Streams
    {
        public Dictionary<string, string> _links { get; set; }
    
        public Stream stream { get; set; }
    }
    
    public class Stream
    {
        public long _id { get; set; }
        public string game { get; set; }
        public int viewers { get; set; }
        public string created_at { get; set; }
        public Dictionary<string, string> _links { get; set; }
        public Preview preview { get; set; }
        public Channel channel { get; set; }
    }
    
    public class Channel
    {
        public Dictionary<string, string> _links { get; set; }
        public object background { get; set; }
        public object banner { get; set; }
        public string broadcaster_language { get; set; }
        public string display_name { get; set; }
        public string game { get; set; }
        public string logo { get; set; }
        public bool mature { get; set; }
        public string status { get; set; }
        public bool partner { get; set; }
        public string url { get; set; }
        public string video_banner { get; set; }
        public int _id { get; set; }
        public string name { get; set; }
        public string created_at { get; set; }
        public string updated_at { get; set; }
        public int delay { get; set; }
        public int followers { get; set; }
        public string profile_banner { get; set; }
        public string profile_banner_background_color { get; set; }
        public int views { get; set; }
        public string language { get; set; }
    }
    
    public class Preview
    {
        public string small { get; set; }
        public string medium { get; set; }
        public string large { get; set; }
        public string template { get; set; }
    }
    
  2. Setelah melakukan ini, Anda sekarang dapat segera melakukan deserialisasi JSON Anda menggunakan JavaScriptSerializer atau Json.NET:

        string test;
        using (WebClient strJson = new WebClient())
        {
            test = strJson.DownloadString("https://api.twitch.tv/kraken/streams/ogaminglol");
        }
    
        var streams1 = JsonConvert.DeserializeObject<Streams>(test);
    
        var streams2 = new System.Web.Script.Serialization.JavaScriptSerializer().Deserialize<Streams>(test);
    

    Dalam kedua kasus tersebut, Anda akan melihat isi kamus ada.

  3. Jika Anda ingin menggunakan DataContractJsonSerializer dan bekerja di .Net 4.5 atau lebih baru, Anda memerlukan metode pembantu berikut:

    private static MemoryStream GenerateStreamFromString(string value)
    {
        return new MemoryStream(Encoding.Unicode.GetBytes(value ?? ""));
    }
    
    public static T GetObject<T>(string json) where T : class
    {
        DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T));
        return GetObject<T>(json, serializer);
    }
    
    public static T GetObject<T>(string json, DataContractJsonSerializerSettings settings) where T : class
    {
        DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T), settings);
        return GetObject<T>(json, serializer);
    }
    
    public static T GetObject<T>(string json, DataContractJsonSerializer serializer)
    {
        using (var stream = GenerateStreamFromString(json))
        {
            return (T)serializer.ReadObject(stream);
        }
    }
    

    lalu sebut saja seperti:

        var streams3 = DataContractJsonSerializerHelper.GetObject<Streams>(test, new DataContractJsonSerializerSettings { UseSimpleDictionaryFormat = true });
    
person dbc    schedule 08.02.2015