gpt4 book ai didi

json - 成员类型更改时如何反序列化 JSON

转载 作者:行者123 更新时间:2023-12-01 20:18:47 24 4
gpt4 key购买 nike

我正在编写一个 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",
"paper": {
"paper": "xxx",
"date": 20200822,
"title": "Newspaper"
},
"title": "Prev Title"
}
}
当没有上一篇或下一篇文章时,我遇到的问题是 Next/Prev 链接。在这种情况下,Next/Prev 将不是“Link”类型而是“bool”类型。 JSON 将简单地读取:

"prev": false
}
作为 Go 的初学者,我需要一些如何正确处理这种情况的建议。
目前,当我“点击”这样的文章时,我的程序会出现 panic :
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)
}
https://play.golang.org/p/PMrbMJAOgaA

关于json - 成员类型更改时如何反序列化 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63540490/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com