我正在尝试使用Reddit的API检索信息。 Here是有关其json响应的一些文档,但是,我只是通过在浏览器中查看链接并漂亮地打印响应here来获得大部分信息。
当注释掉“答复”字段时,以下代码将按预期方式运行,但当未注释时,它将失败。
[edit] getData()是我编写的一个函数,它使用Go的http客户端获取以字节为单位的站点响应。
type redditThing struct {
Data struct {
Children []struct {
Data struct {
Permalink string
Subreddit string
Title string
Body string
Replies redditThing
}
}
}
}
func visitLink(link string) {
println("visiting:", link)
var comments []redditThing
if err := json.Unmarshal(getData(link+".json?raw_json=1"), &comments); err != nil {
logError.Println(err)
return
}
}
这将引发以下错误json: cannot unmarshal string into Go struct field .Data.Children.Data.Replies.Data.Children.Data.Replies.Data.Children.Data.Replies of type main.redditThing
任何帮助将不胜感激。谢谢大家![edit] here指向某些数据的链接,导致程序失败
最佳答案
replies
字段可以是空字符串或redditThing
。通过添加Unmarshal函数来处理空字符串进行修复:
func (rt *redditThing) UnmarshalJSON(data []byte) error {
// Do nothing if data is the empty string.
if bytes.Equal(data, []byte(`""`)) {
return nil
}
// Prevent recursion by declaring type x with
// same underlying type as redditThing, but
// with no methods.
type x redditThing
return json.Unmarshal(data, (*x)(rt))
}
x
类型用于防止不确定的递归。如果该方法的最后一行是json.Unmarshal(data, rt)
,则json.Unmarshal
函数将调用redditThing.UnmarshalJSON
方法,该方法又调用json.Unmarshal
函数,依此类推。繁荣!语句
type x redditThing
声明了一个名为x
的新类型,其基础类型与redditThing
相同。基础类型是匿名结构类型。基础类型没有方法,并且至关重要的是,基础类型没有UnmarshalJSON
方法。这样可以防止递归。