如何解决成员类型更改时如何反序列化JSON
我正在编写一个go程序,以下载我的报纸并将其转换为ePub。
我将文章获取为JSON,并弄清楚了以下结构(示例)
type Article struct {
Id string `json:"id"`
Type string `json:"type"`
Title string `json:"title"`
Author string `json:"author"`
Underline string `json:"underline"`
Next Link `json:"next"`
Prev Link `json:"prev"`
}
type Link struct {
Id string `json:"id"`
Paper Paper `json:"paper"`
}
type Paper struct {
Paper string `json:"paper"`
Date string `json:"date"`
Title string `json:"title"`
}
一个示例json:
{
"id": "89052007","type": "article","title": "The Title","author": "The Author","next": {
"id": "89094743","paper": {
"paper": "xxx","date": 20200822,"title": "Newspaper"
},"title": "Next Title"
},"prev": {
"id": "89094746","title": "Prev Title"
}
}
当没有上一篇或下一篇文章时,我遇到的问题是下一个/上一个链接。在这种情况下,“下一个/上一个”将不是“链接”类型,而是“布尔”类型。 JSON将简单地显示为:
…
"prev": false
}
作为围棋的初学者,我需要一些如何正确处理这种情况的建议。
当前,当我“点击”这样的文章时,我的程序感到恐慌:
panic: assignment to entry in nil map
我按照建议阅读了How to make a nullable field in a struct,但看不到这对您有什么帮助。我根本无法将其与我的问题联系起来。
解决方法
您可以实现json.Unmarshaler
接口。
例如:
type Article struct {
Id string `json:"id"`
Type string `json:"type"`
Title string `json:"title"`
Author string `json:"author"`
Underline string `json:"underline"`
Next Link `json:"next"`
Prev Link `json:"prev"`
}
type Link struct {
Id string `json:"id"`
Paper Paper `json:"paper"`
}
func (l *Link) UnmarshalJSON(data []byte) error {
if string(data) == "false" {
return nil
}
type link Link
return json.Unmarshal(data,(*link)(l))
}
https://play.golang.org/p/fQhDWwO45Nt
或者:
type Article struct {
Id string `json:"id"`
Type string `json:"type"`
Title string `json:"title"`
Author string `json:"author"`
Underline string `json:"underline"`
Next OptionalLink `json:"next"`
Prev OptionalLink `json:"prev"`
}
type Link struct {
Id string `json:"id"`
Paper Paper `json:"paper"`
}
type OptionalLink struct {
Link *Link
}
func (ol *OptionalLink) UnmarshalJSON(data []byte) error {
if string(data) == "false" {
return nil
}
ol.Link = new(Link)
return json.Unmarshal(data,ol.Link)
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。