Unmarshalling Complex Json

时间:2016-10-11 07:32:46

标签: json go reddit

我刚刚开始使用apis和http请求,我正在尝试构建一个使用Reddit API来提取特定subreddit上的帖子的应用程序。

这是我正在练习的包含json和搜索参数的页面: https://www.reddit.com/r/hiphopheads.json?limit=1

查看Golang的JSON模块的标准库,我仍然不明白如何使用json.Unmarshal来处理这个复杂的JSON。从我收集的内容来看,我必须定义一个类似于JSON结构的结构来实际保存数据

我将链接发布到此网站,以了解实际构建的JSON的内容:https://jsonformatter.curiousconcept.com/

现在,我追求的主要内容是Data-> Children-> Data-> Title下的标题。如果我想将JSON解组成一个对象,我是否要定义一个嵌套的struct对象?或者是否有更简单的方法来做到这一点,以便我不必弄清楚JSON的所有属性并自己定义它们?

非常感谢任何可以让我走上正轨的帮助。谢谢!

2 个答案:

答案 0 :(得分:2)

您不必定义结构中不需要的字段。 Unmarshal只会解码结构中存在的值。但是,对于嵌套的JSON,您不幸地必须定义所有父字段(与在xml包中不同,您可以在其中定义标记中的路径)。所以你的结构看起来像这样:

type Foo struct {
    Data struct {
        Children []struct {
            Data struct {
                Title string
            }
        }
    }
}

请参阅此处查看工作示例:https://play.golang.org/p/UeUYfWBONL

答案 1 :(得分:0)

您尝试解组的JSON似乎过于复杂,因此您的结构必须复杂,但这就是它的方式。

有一些工具可以从JSON生成结构定义,这可以节省大量工作。使用您发布的JSON和such an online tool,我生成了以下结构:

package main

type MyJsonName struct {
    Data struct {
        After    string      `json:"after"`
        Before   interface{} `json:"before"`
        Children []struct {
            Data struct {
                ApprovedBy          interface{}   `json:"approved_by"`
                Archived            bool          `json:"archived"`
                Author              string        `json:"author"`
                AuthorFlairCSSClass string        `json:"author_flair_css_class"`
                AuthorFlairText     interface{}   `json:"author_flair_text"`
                BannedBy            interface{}   `json:"banned_by"`
                Clicked             bool          `json:"clicked"`
                ContestMode         bool          `json:"contest_mode"`
                Created             int           `json:"created"`
                CreatedUtc          int           `json:"created_utc"`
                Distinguished       string        `json:"distinguished"`
                Domain              string        `json:"domain"`
                Downs               int           `json:"downs"`
                Edited              bool          `json:"edited"`
                Gilded              int           `json:"gilded"`
                Hidden              bool          `json:"hidden"`
                HideScore           bool          `json:"hide_score"`
                ID                  string        `json:"id"`
                IsSelf              bool          `json:"is_self"`
                Likes               interface{}   `json:"likes"`
                LinkFlairCSSClass   string        `json:"link_flair_css_class"`
                LinkFlairText       string        `json:"link_flair_text"`
                Locked              bool          `json:"locked"`
                Media               interface{}   `json:"media"`
                MediaEmbed          struct{}      `json:"media_embed"`
                ModReports          []interface{} `json:"mod_reports"`
                Name                string        `json:"name"`
                NumComments         int           `json:"num_comments"`
                NumReports          interface{}   `json:"num_reports"`
                Over18              bool          `json:"over_18"`
                Permalink           string        `json:"permalink"`
                Quarantine          bool          `json:"quarantine"`
                RemovalReason       interface{}   `json:"removal_reason"`
                ReportReasons       interface{}   `json:"report_reasons"`
                Saved               bool          `json:"saved"`
                Score               int           `json:"score"`
                SecureMedia         interface{}   `json:"secure_media"`
                SecureMediaEmbed    struct{}      `json:"secure_media_embed"`
                Selftext            string        `json:"selftext"`
                SelftextHTML        string        `json:"selftext_html"`
                Stickied            bool          `json:"stickied"`
                Subreddit           string        `json:"subreddit"`
                SubredditID         string        `json:"subreddit_id"`
                SuggestedSort       interface{}   `json:"suggested_sort"`
                Thumbnail           string        `json:"thumbnail"`
                Title               string        `json:"title"`
                Ups                 int           `json:"ups"`
                URL                 string        `json:"url"`
                UserReports         []interface{} `json:"user_reports"`
                Visited             bool          `json:"visited"`
            } `json:"data"`
            Kind string `json:"kind"`
        } `json:"children"`
        Modhash string `json:"modhash"`
    } `json:"data"`
    Kind string `json:"kind"`
}

通常,这些工具的输出仍然需要手动调整才能正常工作。例如:

MediaEmbed          struct{}      `json:"media_embed"`

我很确定这不是什么需要。但它确实显示了基本思想并正确地找出了大部分内容。您可以尝试其他类似的工具。