解组复杂 Json
Unmarshalling Complex Json
我最近才开始使用 api 和 http 请求,我正在尝试构建一个使用 Reddit API 来拉取特定 subreddit 上的帖子的应用程序。
这是带有 json 和我正在练习的搜索参数的页面:
https://www.reddit.com/r/hiphopheads.json?limit=1
看了Golang的JSON模块的标准库,还是不明白json.Unmarshal这个复杂的JSON怎么用。据我所知,我必须定义一个类似于 JSON 结构的结构来实际保存数据
我将 link 发布到该网站以了解 JSON 的实际结构:https://jsonformatter.curiousconcept.com/
现在我主要关注的是数据->Children->数据->标题下的标题。如果我想将 JSON 解组为 object,我是否定义嵌套结构 object?或者有没有更简单的方法来做到这一点,这样我就不必弄清楚 JSON 的所有属性并自己定义它们??
非常感谢任何能让我走上正轨的帮助。谢谢!
您尝试解组的 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"`
我很确定这不是这里所需要的。但它在展示基本思想和正确理解大部分内容方面确实大有帮助。您可以尝试其他类似的工具。
您不必在结构中定义不需要的字段。 Unmarshal 只会解码结构中存在的值。但是不幸的是,对于嵌套的 JSON,您还必须定义所有父字段(与 xml 包不同,您可以在其中定义标签中的路径)。所以你的结构看起来像这样:
type Foo struct {
Data struct {
Children []struct {
Data struct {
Title string
}
}
}
}
请在此处查看工作示例:https://play.golang.org/p/UeUYfWBONL
我最近才开始使用 api 和 http 请求,我正在尝试构建一个使用 Reddit API 来拉取特定 subreddit 上的帖子的应用程序。
这是带有 json 和我正在练习的搜索参数的页面: https://www.reddit.com/r/hiphopheads.json?limit=1
看了Golang的JSON模块的标准库,还是不明白json.Unmarshal这个复杂的JSON怎么用。据我所知,我必须定义一个类似于 JSON 结构的结构来实际保存数据
我将 link 发布到该网站以了解 JSON 的实际结构:https://jsonformatter.curiousconcept.com/
现在我主要关注的是数据->Children->数据->标题下的标题。如果我想将 JSON 解组为 object,我是否定义嵌套结构 object?或者有没有更简单的方法来做到这一点,这样我就不必弄清楚 JSON 的所有属性并自己定义它们??
非常感谢任何能让我走上正轨的帮助。谢谢!
您尝试解组的 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"`
我很确定这不是这里所需要的。但它在展示基本思想和正确理解大部分内容方面确实大有帮助。您可以尝试其他类似的工具。
您不必在结构中定义不需要的字段。 Unmarshal 只会解码结构中存在的值。但是不幸的是,对于嵌套的 JSON,您还必须定义所有父字段(与 xml 包不同,您可以在其中定义标签中的路径)。所以你的结构看起来像这样:
type Foo struct {
Data struct {
Children []struct {
Data struct {
Title string
}
}
}
}
请在此处查看工作示例:https://play.golang.org/p/UeUYfWBONL