0

jsonstream.Lengthが、次の試行中にSystem.NotSupportedException エラータイプの例外をスローしました。

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

Webclientでも試してみましたが、それでも同じエラーです。これは応答サイズが大きいためですか?

リクエスト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; }
    }
4

3 に答える 3

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

ここに画像の説明を入力

于 2012-08-28T16:49:39.923 に答える
1

これを試しましたか?

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

実際にはコメントする必要がありますが、追加できませんでした。

于 2012-08-28T10:49:43.567 に答える
-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);
                }
            }

 } 
于 2012-08-28T12:12:44.000 に答える