C# 将JSON数组反序列化为C

C# 将JSON数组反序列化为C,c#,.net,arrays,json,C#,.net,Arrays,Json,我正在尝试查询RedditAPI,并在一个线程的答案上循环,以获得我想要的答案。然而,当我以查询api为例时,我将得到一个包含两个对象的json数组。我想在对象2上循环,因为这是包含所有实际注释的对象,第一个对象是线程本身 这看起来像是C语言中的一个挑战,或者至少对我来说是一个挑战。我使用JSON.NET或Newtonsoft.JSON来实现这一点,这就是我目前所拥有的: var commentPath = $"http://www.reddit.com/comments/{questionId

我正在尝试查询RedditAPI,并在一个线程的答案上循环,以获得我想要的答案。然而,当我以查询api为例时,我将得到一个包含两个对象的json数组。我想在对象2上循环,因为这是包含所有实际注释的对象,第一个对象是线程本身

这看起来像是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) { }

如果有人能帮助我获得我想要的评论,我将非常高兴。

基于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)
            {
            }
        }

您是否尝试过在VisualStudio中使用“粘贴JSON作为类”功能@BenCottrell否,但当我尝试这样做时,它将我的内容标识为xml并给出一个错误:/这正是我之前所做的,但随后我出现了以下错误:Newtonsoft.Json.Json序列化异常:无法将当前Json对象(例如{“name”:“value”})反序列化为类型“Sofie.Models.Reddit[]”,因为该类型需要Json数组(例如[1,2,3])才能正确反序列化。若要修复此错误,请将JSON更改为JSON数组,例如[1,2,3],或更改反序列化类型,使其成为正常的.NET类型,例如,不是integer之类的基元类型,也不是可以从JSON对象反序列化的数组或列表之类的集合类型。但是json是一个数组!我用这个url检查了我的解决方案:如果我只使用类型而不是数组,那么一切都正常,没有任何错误,但是子线程似乎是线程,而不是实际的注释。刚刚意识到一个巨大的错误,var commentJson=wait response.Content.ReadAsStringAsync;应为var commentJson=await commentResponse.Content.ReadAsStringAsync;因为我正在做另一个请求之前,这一个,以找到线程。有了这样的改变,它当然可以正常工作。
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)
            {
            }
        }