【问题标题】:Converting json to custom object array将 json 转换为自定义对象数组
【发布时间】:2023-03-11 22:44:01
【问题描述】:

我正在尝试使用 C# 和 Json.Net 为 Windows Phone 7 创建一个 reddit 应用程序(仅供练习)。我正在尝试将 json 转换为 c# 可以使用的东西,以及其他一些东西。我可以提取我想要的数据,但不知道我是否使用了正确的方法。然后,一旦我有了 json 数据,我就无法将其转换为自定义对象。无论如何,我确信这段代码有很多错误,所以任何有助于理顺我的标题的帮助将不胜感激。

代码如下:

   public partial class MainPage : PhoneApplicationPage
    {
        string json = "";
    RootObject topic = new RootObject();
    public MainPage()
    {
        InitializeComponent();
    }
    private void Button_Click(object sender, RoutedEventArgs e)
    {
        textBlock1.Text = "Retrieving...";
        string url = @"http://www.reddit.com/r/all.json";
        HttpWebRequest hWebRequest = (HttpWebRequest)HttpWebRequest.Create(url);
        hWebRequest.Method = "GET";
        hWebRequest.BeginGetResponse(Response_Completed, hWebRequest);
    }
    public void Response_Completed(IAsyncResult result)
    {
        HttpWebRequest request = (HttpWebRequest)result.AsyncState;
        HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(result);
        using (StreamReader streamReader = new StreamReader(response.GetResponseStream()))
        {
            json = streamReader.ReadToEnd();
            topic = JsonConvert.DeserializeObject<RootObject>(json);

        }
        Deployment.Current.Dispatcher.BeginInvoke(() =>
        {
            //textBlock2.Text = topic.data2.title;
            textBlock1.Text = "Done.";
        });

这一行告诉我需要一个“新”调用。

textBlock2.Text = topic.data2.title;

现在这部分给我带来了麻烦。如何正确实例化 data、data2 和 child?

     public class MediaEmbed
    {
    }

    public class Data2
    {
        public string domain { get; set; }
        public MediaEmbed media_embed { get; set; }
        public object levenshtein { get; set; }
        public string subreddit { get; set; }
        public string selftext_html { get; set; }
        public string selftext { get; set; }
        public object likes { get; set; }
        public bool saved { get; set; }
        public string id { get; set; }
        public bool clicked { get; set; }
        public string title { get; set; }
        public object media { get; set; }
        public int score { get; set; }
        public bool over_18 { get; set; }
        public bool hidden { get; set; }
        public string thumbnail { get; set; }
        public string subreddit_id { get; set; }
        public string author_flair_css_class { get; set; }
        public int downs { get; set; }
        public bool is_self { get; set; }
        public string permalink { get; set; }
        public string name { get; set; }
        public double created { get; set; }
        public string url { get; set; }
        public string author_flair_text { get; set; }
        public string author { get; set; }
        public double created_utc { get; set; }
        public int num_comments { get; set; }
        public int ups { get; set; }
        //public override string ToString()
        //{
        //    return title;
        //}
    }

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

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

    public class RootObject
    {
        public RootObject()
        {
        }
        public string kind { get; set; }
        public Data data = new Data();
        public Data2 data2 = new Data2();
        public Child child = new Child();
    }
}

【问题讨论】:

  • 欢迎来到该网站 - 无需在您的问题标题中添加 [已解决] 标签;将答案标记为已接受是我们的网站表示问题已解决的方式。
  • 抱歉,感谢您提供的信息。

标签: c# json windows-phone-7 reddit


【解决方案1】:

我发现您所拥有的存在一些问题。第一个是您必须将 json 数据反序列化到的类的结构。为此手动编写类非常繁琐且容易出错,因此我通常喜欢使用this site 插入 json 并取出我需要的类并根据需要重命名。然后,我会去寻找数据的api docs,以填补数据根本没有的类中的任何空白。

之后,您只需要反序列化您现在拥有的根对象类的单个实例,而不是它们的列表,例如:

RootObject topics = JsonConvert.DeserializeObject<RootObject>(json);

另一个注意事项是,当您反序列化数据时,在您的代码中,您当前正在声明一个名为 topics 的新局部变量,该变量在该特定范围内隐藏了您的成员变量,该变量也称为 topics,并且因此,如果您检查该成员变量,您会发现其中没有任何数据。你不想在那里声明一个新变量,你只想使用现有的成员变量,所以你只想这样做:

topics = JsonConvert.DeserializeObject<RootObject>(json);

甚至this.topics,如果您想真正明确并清楚该变量的来源。

【讨论】:

  • 感谢您的回复。我已经更新了我的程序以遵守你所说的并且事情变得更好,但我仍然有一些问题(我自己的错)。这些问题源于 redditObject 类,我将其称为 RootObject。当我尝试从 data2 类中提取一个值时,它说我需要创建该类的一个新实例。但是,我不确定该去哪里做这件事。建议?我会坚持下去的。另外,我已经用新代码更新了原始帖子。
  • 你的 RootObject 看起来像它的样子是有原因的吗?当我通过转换器运行 json 时,我总是得到:public class RootObject { public string kind { get; set; } public Data data { get; set; } } 然后,要获得第一项的标题,你会做 topic.data.children[0].title
  • 另外,在我看来,您对数据结构的工作方式并不十分清楚。 RootObject 包含一个 Data 类的实例,该类又包含一个 Children 数组,每个数组代表 all.json 中的一个主题。因此,您仍然会收到主题列表,而不是单个主题,但它们嵌套在其他几个数据结构中。
  • 出于连我自己都不知道的原因,我在 RootClass 中创建了额外的方法。我已经回去直接从那个甜蜜的 json2c# 转换器中重新复制了代码。我现在很清楚我的问题是我忽略了 children 是一个数组的事实。我没有包括我想从中提取数据的索引。老实说,json 和 c# 对我来说真的很新,我不确定数据模型会是什么样子以及如何将它们一起使用。我回家后会试试这个。看起来我只需要索引器。
  • 它现在正在工作。我在索引中添加了,一切都很好。非常感谢你的帮助。顺便说一句,调用标题的行是 topic.data.children[0].data.title;。只需将其添加到这篇文章中,以防有人一直在寻找答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-20
  • 1970-01-01
相关资源
最近更新 更多