Twitch API: วิธีรับ _links?

ฉันใช้ Twitch API สำหรับโปรเจ็กต์ของฉัน และฉันต้องดึงค่า _links บน : https://api.twitch.tv/kraken/streams/ogaminglol (ตัวอย่าง)

ฉันใช้รหัสนี้:

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();

และคลาส Streams ของฉันที่ได้รับข้อมูล

[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; }
}

ตนเองและช่องเป็นโมฆะเพราะใน https://api.twitch.tv/kraken/streams/ogaminglol อยู่ในส่วน "_links" ฉันลองใช้ Dictionary แล้ว แต่ไม่ประสบผลสำเร็จ ฉันหวังว่าคุณจะเข้าใจปัญหาของฉัน (และภาษาอังกฤษของฉัน :p)


person Froelicher    schedule 07.02.2015    source แหล่งที่มา


คำตอบ (1)


มีปัญหาหลายประการที่นี่ หลายประการที่อาจทำให้เกิดอาการที่คุณอธิบายได้:

  1. โมเดลข้อมูลของคุณไม่ตรงกับ JSON self เป็นคุณสมบัติของ _links ไม่ใช่ Streams channel ปรากฏเป็นคุณสมบัติใน _links และ stream ไม่ใช่ Streams

  2. คลาส Streams ของคุณมีคุณสมบัติ DataMember _10 ซึ่งเป็นคลาสนามธรรม แน่นอนว่าสิ่งนี้ไม่สามารถดีซีเรียลไลซ์ได้ บางทีคุณอาจลืมใส่ไว้ในคำถามของคุณ?

  3. พจนานุกรม _links ของคุณอยู่ในรูปแบบพจนานุกรม "ธรรมดา" เช่น DataContractJsonSerializerSettings.UseSimpleDictionaryFormat = true. คุณต้องใช้การตั้งค่านี้ (.Net 4.5 หรือใหม่กว่าเท่านั้น) หรือสลับไปที่ JavaScriptSerializer หรือ Json.NET >.

  4. คุณกำลังใช้การเข้ารหัส ASCII ซึ่งจำกัดไว้ที่อักขระ Unicode ต่ำสุด 128 ตัว ใช้ Encoding.Unicode แทน

  5. WebClient เป็นแบบใช้แล้วทิ้ง ดังนั้นควรสร้างอินสแตนซ์ภายในคำสั่ง using

เพื่อแก้ไขปัญหานี้ คุณจะต้อง:

  1. ไปที่ http://json2csharp.com/ โพสต์ JSON ของคุณ และให้มันสร้างคลาสให้คุณ จากนั้นแปลงทั้งหมด คุณสมบัติ _links เป็น public Dictionary<string, string> _links { get; set; } คุณควรได้รับสิ่งนี้:

    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. หลังจากดำเนินการนี้แล้ว ตอนนี้คุณสามารถดีซีเรียลไลซ์ JSON ของคุณได้ทันทีโดยใช้ JavaScriptSerializer หรือ 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);
    

    ในทั้งสองกรณีคุณจะเห็นเนื้อหาพจนานุกรมปรากฏอยู่

  3. หากคุณต้องการใช้ DataContractJsonSerializer และใช้งาน .Net 4.5 หรือใหม่กว่า คุณต้องมีวิธีช่วยเหลือต่อไปนี้:

    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);
        }
    }
    

    แล้วเรียกมันว่า:

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