2017-01-29 31 views
0

Reddit APIをクエリしてスレッドの回答をループして、必要な答えを得ようとしています。しかし、私はAPI(https://www.reddit.com/comments/2pfyg8.json?sort=topを例として)を照会すると、2つのオブジェクトを持つjson配列を取得します。私はすべての実際のコメントを持つオブジェクトであり、最初のオブジェクトはスレッドそのものなので、オブジェクト番号2をループしたい。JSON配列をC#にデシリアライズ

これはC#の挑戦のように思えますが、少なくとも私の挑戦です。私はこれを達成するためにJSON.NETまたはNewtonsoft.Jsonを使用し、これは私がこれまで持っているものです。

var commentPath = $"http://www.reddit.com/comments/{questionId}.json?sort=top"; 
HttpResponseMessage commentResponse = await client.GetAsync(commentPath); 
var commentJson = await response.Content.ReadAsStringAsync(); 
var answers = JsonConvert.DeserializeObject<dynamic>(commentJson); 

int commentCount = 0; 
foreach (var answerContainer in answers[1].data.children) { } 

私も、私はdynamicの代わりに使用するための正しいタイプを生成するためにhttp://json2csharp.com/を使用しようとしましたが、のように誤っているように思われますよく

これは私が受け取るエラーです:

System.ArgumentException: Accessed JObject values with invalid key value: 1. Object property name expected. vid Newtonsoft.Json.Linq.JObject.get_Item(Object key) vid CallSite.Target(Closure , CallSite , Object , Int32) 

誰かが私が探していますコメントを得るために、私の探求の私を助けることができたならば、私は非常に喜んでいるだろう。

+2

はあなたを持っているが* JSONをVisual Studioのクラス*機能として貼り付けることを試みましたか? https://blogs.msdn.microsoft.com/webdev/2012/12/18/paste-json-as-classes-in-asp-net-and-web-tools-2012-2-rc/ –

+0

@BenCottrellいいえしかし、私がそれを試みているとき、それはxmlとして自分のコンテンツを識別し、エラーを出します。 : – Ms01

答えて

1

のRedditからのJSON応答に基づいて、私はこのクラス(Visual Studioでのクラスの関数としてJSONを貼り付け)生成:

public class reddit 
{ 
    public string kind { get; set; } 
    public Data data { get; set; } 
} 

public class Data 
{ 
    public string modhash { get; set; } 
    public Child[] children { get; set; } 
    public object after { get; set; } 
    public object before { get; set; } 
} 

public class Child 
{ 
    public string kind { get; set; } 
    public Data1 data { get; set; } 
} 

public class Data1 
{ 
    public bool contest_mode { get; set; } 
    public object banned_by { get; set; } 
    public Media_Embed media_embed { get; set; } 
    public string subreddit { get; set; } 
    public string selftext_html { get; set; } 
    public string selftext { get; set; } 
    public object likes { get; set; } 
    public object suggested_sort { get; set; } 
    public object[] user_reports { get; set; } 
    public object secure_media { get; set; } 
    public bool saved { get; set; } 
    public string id { get; set; } 
    public int gilded { get; set; } 
    public Secure_Media_Embed secure_media_embed { get; set; } 
    public bool clicked { get; set; } 
    public object report_reasons { get; set; } 
    public string author { get; set; } 
    public object media { get; set; } 
    public int score { get; set; } 
    public object approved_by { get; set; } 
    public bool over_18 { get; set; } 
    public string domain { get; set; } 
    public bool hidden { get; set; } 
    public int num_comments { get; set; } 
    public string thumbnail { get; set; } 
    public string subreddit_id { get; set; } 
    public bool edited { get; set; } 
    public object link_flair_css_class { get; set; } 
    public object author_flair_css_class { get; set; } 
    public int downs { get; set; } 
    public bool archived { get; set; } 
    public object removal_reason { get; set; } 
    public bool stickied { get; set; } 
    public bool is_self { get; set; } 
    public bool hide_score { get; set; } 
    public bool spoiler { get; set; } 
    public string permalink { get; set; } 
    public bool locked { get; set; } 
    public string name { get; set; } 
    public float created { get; set; } 
    public string url { get; set; } 
    public object author_flair_text { get; set; } 
    public bool quarantine { get; set; } 
    public string title { get; set; } 
    public float created_utc { get; set; } 
    public object link_flair_text { get; set; } 
    public int ups { get; set; } 
    public float upvote_ratio { get; set; } 
    public object[] mod_reports { get; set; } 
    public bool visited { get; set; } 
    public object num_reports { get; set; } 
    public object distinguished { get; set; } 
    public string link_id { get; set; } 
    public object replies { get; set; } 
    public string parent_id { get; set; } 
    public int controversiality { get; set; } 
    public string body { get; set; } 
    public string body_html { get; set; } 
    public bool score_hidden { get; set; } 
} 

public class Media_Embed 
{ 
} 

public class Secure_Media_Embed 
{ 
} 

をそして、コードを作業すると、そのようになっています

using (var client = new HttpClient()) 
     { 
      var commentPath = $"http://www.reddit.com/comments/{questionId}.json?sort=top"; 
      HttpResponseMessage commentResponse = client.GetAsync(commentPath).Result; 
      var commentJson = commentResponse.Content.ReadAsStringAsync().Result; 
      var answers = JsonConvert.DeserializeObject<reddit[]>(commentJson); 

      int commentCount = 0; 
      foreach (var answerContainer in answers[1].data.children) 
      { 
      } 
     } 
+0

これは私が以前に行ったことですが、このエラーが発生します: 'Newtonsoft.Json.JsonSerializationException:現在のJSONオブジェクト(たとえば{" name ":" value "})を 'Sofie.Models'型に逆シリアル化できません。 Reddit [] '型でJSON配列(例:[1,2,3])が正しくデシリアライズされる必要があるためです。このエラーを修正するには、JSON配列をJSON配列(例:[1,2,3])に変更するか、デシリアライズされた型を通常の.NET型に変更します(例:integerのようなプリミティブ型ではなく、配列またはリスト)は、JSONオブジェクトからデシリアライズできます。 しかし、jsonは配列です! – Ms01

+1

私はこのURLで私のソリューションをチェックしました:https://www.reddit.com/comments/2pfyg8.json?sort=topそしてすべてエラーなしで正常に動作しています –

+0

配列だけでなく配列だけを使用しても動作しますが子供たちは実際のコメントではなくスレッドであるようです。 – Ms01

関連する問題