0

http://www.viki.com/api/v2/channels.jsonから JSON リクエストを取得しています

これで、JSON から次のクラスが作成されました。

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

ここで、Thumbnails2 の大規模および中規模の値と、List のすべてのエピソードから値を取得したいと考えています。

私が試した:

using (var wc = new WebClient())
{
  var json = wc.DownloadString(jsonRequestURL);

  dynamic vikiDesrialized = JsonConvert.DeserializeObject(json);
  foreach (var item in vikiDesrialized)
  {
     //Console.WriteLine(item.title);

     foreach (var thumnails in item.thumbnails)
     {
          JsonConvert.DeserializeObject(thumbNails);
     }
  }
}

しかし、何か他のことを意味する例外を取得します:

「指定されたバインディング制約に一致するタイプ 'Viki.MainWindow' でのコンストラクターの呼び出しが例外をスローしました。」行番号「3」および行位置「9」。

LINQ を使用してこれらの値を取得できますか?

4

2 に答える 2

1

2回目の逆シリアル化は必要ありませんJsonConvert.DeserializeObject(thumbNails);

どちらかを使用

foreach (var item in dynObj)
{
    Console.WriteLine(item.title);
    Console.WriteLine(item.thumbnails.small);
}

また

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
                }).ToArray();
}
于 2012-08-29T06:04:10.130 に答える
0

DataContractsを使用してDataContractJsonSerializerを使用する方が簡単な方法ではないでしょうか。

これまで、ファイルからのJSONオブジェクトからの逆シリアル化でのみ使用してきましたが、とても簡単です。

アトリビュート[DataContract]を使用してクラスを宣言し、[DataMember]を使用して逆シリアル化する必要がある各メンバーを宣言するだけです。

例(私のコードから)

[DataContract]
public class CharacteristicManager
{
  [DataMember(Order = 1)]
  public Characteristic[] characteristics;
  private Dictionary<String, Characteristic> characteristic_dictionary;
 }

デシリアライズは次のようになります。

DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(CharacteristicManager));

CharacteristicManager cm = (CharacteristicManager)ser.ReadObject(stream);

DataContractJsonSerializerは、配列、リスト、辞書を含むオブジェクト全体を再帰的に構築します。

最高のトーマス

于 2012-08-29T06:40:13.200 に答える