2012-08-28 36 views
0

我正在試圖爲jsonstream.Length扔類型System.NotSupportedException的異常 錯誤:無法分配HttpWebResponse.GetResponseStream()到流

HttpWebRequest jsonHTTPRequest = (HttpWebRequest)WebRequest.Create(jsonRequestURL); 
     jsonHTTPRequest.ContentType = "application/json; charset=utf-8"; 

     HttpWebResponse jsonHTTPResponse = (HttpWebResponse)jsonHTTPRequest.GetResponse(); 
     RootObject vikiRootObject = default(RootObject); 

     using (Stream jsonstream = jsonHTTPResponse.GetResponseStream()) 
     { 
      //encoding encode = system.text.encoding.getencoding("utf-8"); 
      DataContractJsonSerializer serializer = 
            new DataContractJsonSerializer(typeof(RootObject)); 
      vikiRootObject = (RootObject)serializer.ReadObject(jsonstream); 
     } 

還與Web客戶端嘗試,但仍然是相同的錯誤。 這是因爲響應大嗎?

請求URL是: http://www.viki.com/api/v2/channels.json

WebClient webClient = new WebClient(); 
       RootObject vikiChannelData = default(RootObject); 
       webClient.OpenReadAsync(new Uri(jsonRequestURL), UriKind.RelativeOrAbsolute); 

       webClient.OpenReadCompleted += (obj, Args) => 
        { 
         //DataContractJsonSerializer vikiChannelerialized = new DataContractJsonSerializer(typeof(RootObject),null); 
         DataContractJsonSerializer vikiChannelerialized = new DataContractJsonSerializer(typeof(RootObject)); 
         vikiChannelData = vikiChannelerialized.ReadObject(Args.Result) as RootObject; 
         Console.WriteLine(); 
        }; 

編輯: 我與LINQ嘗試:

var RootObjects = from vikiroot in vikiRootObject 
            select new Thumbnails2 
            { 
             thumbnails = vikiRootObject.thumbnails 
            }; 

但得到的錯誤,找不到的實現源類型對象的查詢模式。選擇未找到。

我的階層結構是這樣的:

public class RootObject 
    { 
     public int id { get; set; } 
     public string title { get; set; } 
     public string description { get; set; } 
     public string uri { get; set; } 
     public List<Episode> episodes { get; set; } 
     public Thumbnails2 thumbnails { get; set; } 
     public string timestamp { get; set; } 
     public List<object> genres { get; set; } 
     public string origin_code { get; set; } 
    } 

public class Thumbnails2 
    { 
     public string c_220_160 { get; set; } 
     public string c_102_102 { get; set; } 
     public string c_180_130 { get; set; } 
     public string c_110_80 { get; set; } 
     public string xl { get; set; } 
     public string large { get; set; } 
     public string medium { get; set; } 
     public string small { get; set; } 
     public string c_320_300 { get; set; } 
     public string c_640_600 { get; set; } 
     public string c_95_70 { get; set; } 
     public string c_190_140 { get; set; } 
     public string c_280_200 { get; set; } 
     public string c_560_400 { get; set; } 
    } 

回答

2

你返回的JSON是不是一個單一的對象,而不是它是一個數組。既然你沒有張貼您的RootObject和其他子類(我懶得宣佈他們)我會用Json.Netdynamic關鍵字

using (var wc = new WebClient()) 
{ 
    var json = wc.DownloadString("http://www.viki.com/api/v2/channels.json"); 
    dynamic dynObj = JsonConvert.DeserializeObject(json); 

    foreach (var item in dynObj) 
    { 
     Console.WriteLine(item.title); 
     foreach (var episode in item.episodes) 
     { 
      Console.WriteLine("\t" + episode.title); 
     } 
    } 

} 

編輯

using (var wc = new WebClient()) 
{ 
    var json = wc.DownloadString("http://www.viki.com/api/v2/channels.json"); 
    var rootObj = JsonConvert.DeserializeObject<RootObject[]>(json); 

    var obj = rootObj.Select(r=>new 
        { 
         Title = r.title, 
         Thumbnail = r.thumbnails.small 
        }); 
} 

enter image description here

+0

謝謝,但你可以請LINQ表達式幫助獲得敢,我試過但得到錯誤無法找到源類型對象的查詢模式的實現。選擇未找到,更新了問題 – Simsons

+0

@Simsons我更新了答案。 –

1

你試試這個?

using (StreamReader reader = new StreamReader(jsonHTTPResponse.GetResponseStream())) 
     { 
      //your code goes here 
     } 

其實應該在評論中,但我無法添加一個。

+0

的readObject接受一個流,所以我不需要一個流讀取器 – Simsons

-1

嘗試通過複製到內存流執行以下操作,以便能夠讀取流:

using (Stream jsonstream = jsonHTTPResponse.GetResponseStream()) 
     { 
      DataContractJsonSerializer serializer = 
            new DataContractJsonSerializer(typeof(RootObject)); 

      using (MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(jsonstream))) 
      { 
       vikiRootObject = (RootObject)serializer.ReadObject(jsonstream); 

       using (MemoryStream ms2 = new MemoryStream()) 
       { 
        ser.WriteObject(ms2, vikiRootObject); 
        string serializedJson = Encoding.UTF8.GetString(ms2.GetBuffer(), 0, (int)ms2.Length); 
       } 
      } 

} 
+0

當第一個使用塊不會得到任何數據爲什麼要繼續操作的其餘部分! – Simsons