2015-02-07 2 views
0

내가 내 프로젝트에 대한 트 위치 API를 사용하고 난에 _links 값을 가져 오기 위해 필요 : 데이터Twitch API : _links를 가져 오는 방법?

[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; } 
} 
를받을

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

그리고 내 스트림 클래스 :

나는이 코드를 사용 https://api.twitch.tv/kraken/streams/ogaminglol (예)

https://api.twitch.tv/kraken/streams/ogaminglol의 "_links"섹션에 있기 때문에 자기 채널이 null입니다. 사전은 있지만 성공하지는 못했습니다. 나는 내 문제 (그리고 영어 : p)를 이해하기를 바랍니다.

답변

0

당신이 설명하는 증상의 원인이 될 수있는의 여기에 몇 가지 여러 문제가 있습니다

  1. 귀하의 데이터 모델은 JSON의 일치하지 않습니다. self_links의 속성이 아니며 Streams이 아닙니다. channel_linksstream이 아닌 Streams에 속성으로 표시됩니다.

  2. 클래스 Streams은 추상적 클래스 인 DataMember 속성 Stream을 포함합니다. 물론 이것은 비 직렬화 될 수 없습니다. 질문에 그것을 포함하는 것을 잊었을 수 있습니까?

  3. _links 사전은 "간단한"사전 형식 (예 : DataContractJsonSerializerSettings.UseSimpleDictionaryFormat = true)입니다. 이 설정 (.Net 4.5 이상 만)을 사용하거나 JavaScriptSerializer 또는 Json.NET으로 전환해야합니다.

  4. ASCII encoding은 128 개의 유니 코드 문자로 제한됩니다. 대신 Encoding.Unicode을 사용하십시오.

  5. WebClient은 일회용이므로 using 문 내부에서 인스턴스화해야합니다. , http://json2csharp.com/

    1. 이동하여 JSON을 게시하고, 그 다음, 당신을위한 클래스를 생성 public Dictionary<string, string> _links { get; set; }에 모든 _links 속성을 변환이 :

    는 당신이 필요로이 문제를 해결합니다. 당신이 얻을해야합니다
    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; } 
    } 
    
  6. 이 작업을 완료하는 데, 당신은 지금 즉시 사용하여 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); 
    

    두 경우 모두 당신이 사전 내용이 존재 볼 수 있습니다 .

  7. DataContractJsonSerializer을 사용하고 .Net 4에서 작업하는 경우.좋아 다음

    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 }); 
    
5 이상, 당신은 다음과 같은 헬퍼 메소드가 필요합니다