Golang,将json解码为自定义结构

时间:2014-01-01 08:20:17

标签: json go reddit

我正在尝试将json API中的reddit内容拉入客户端的自定义结构中。我想出的结构是

type Subreddit struct {
        offset int
        num_of_posts int
        subscribers: int
        thumbnail string
        children []post
}

type post struct {
        type string
        url string
        thumbnail string
        submitted_by string
        upvotes int
        downvotes int
}       

不幸的是,reddit json的格式化甚至接近于此,此外我还想过滤掉我无法支持的网址。

我知道这样做的唯一方法是为源数据中的每个“子”创建一个接口,并手动遍历每个子项,为每个接口创建一个单独的“post”。并将它们推入subreddit对象的post数组中。

作为参考,数据格式为http://www.reddit.com/r/web_design/.json

这是正确的方法吗?或者有更快的方式。对于这么小的任务来说,这似乎是一个很大的开销,但我是一个PHP Javascript dev,所以我想这对我来说很不寻常。

1 个答案:

答案 0 :(得分:4)

在我开始回答这个问题之前:
请注意,您的结构字段必须导出,才能与encoding/json包一起使用。

其次,我必须承认我并不完全确定你对整个create an interface for each of the "children"部分的意思。但它听起来很复杂;)
无论如何,回答你的问题:

如果您希望使用标准encoding/json包来解组json,则必须使用中间结构,除非您使用与Reddit使用的结构类似的结构。

下面您可以找到Reddit结构的某些部分可能如何映射到Go结构的示例。通过将json解组为RedditRoot的实例,您可以轻松地遍历子项,删除任何不需要的子项,并填充您的Subreddit结构:

type RedditRoot struct {
    Kind string     `json:"kind"`
    Data RedditData `json:"data"`
}

type RedditData struct {
    Children []RedditDataChild `json:"children"`
}

type RedditDataChild struct {
    Kind string `json:"kind"`
    Data *Post  `json:"data"`
}

type Post struct {
    Type         string `json:"-"` // Is this equal to data.children[].data.kind?
    Url          string `json:"url"`
    Thumbnail    string `json:"thumbnail"`
    Submitted_by string `json:"author"`
    Upvotes      int    `json:"ups"`
    Downvotes    int    `json:"downs"`
}