如何编组/解组在 Go 中有两种不同格式的通用 JSON 和 BSON 键/字段?
Posted
技术标签:
【中文标题】如何编组/解组在 Go 中有两种不同格式的通用 JSON 和 BSON 键/字段?【英文标题】:How to Marshal/Unmarshal a common JSON & BSON key/field that can have two different formats in Go? 【发布时间】:2022-01-11 15:39:10 【问题描述】:我目前将 mongo 数据以两种形式(特别是内容键)存储在一个集合中。部分样本数据如下:
格式 1。
"type": "text",
"content": "foobar",
"extraTextData": "hello text"
格式 2
"type": "group",
"content": [
"type": "text",
"content": "grouped-foobar"
,
"type": "image",
"url": "https://abc.jpg"
,
],
"extraGroupData": "hello group"
下面是我在 golang 中构建它的尝试。
type C struct
Type string `json:"type" bson:"type"`
Content ???
*TextC
*GroupC
type TextC struct
ExtraTextData `json:"extraTextData" bson:"extraTextData"`
type GroupC struct
ExtraGroupData `json:"extraGroupData" bson:"extraGroupData"`
我在如何设置适用于 TextC 和 GroupC 格式的“内容”字段的结构时遇到问题。
GroupC 的内容可以是 C 数组,例如 - Content []C
TextC 的内容也可以是字符串类型。
有人可以帮忙并举例说明如何解决这种情况吗?
【问题讨论】:
【参考方案1】:Format2 json 无效。你可以在这里查看:https://jsonlint.com/
我为您的案例创建了一个示例场景。
你可以在这里试试:https://go.dev/play/p/jaUE3rjI-Ik
像这样使用interface
:
type AutoGenerated struct
Type string `json:"type"`
Content interface `json:"content"`
ExtraTextData string `json:"extraTextData,omitempty"`
ExtraGroupData string `json:"extraGroupData,omitempty"`
您还应该从 Format2 中删除 comma
:
"type": "group",
"content": [
"type": "text",
"content": "grouped-foobar"
,
"type": "image",
"url": "https://abc.jpg"
],
"extraGroupData": "hello group"
如果您不删除comma
,则会出现如下错误:
invalid character ']' looking for beginning of value
【讨论】:
以上是关于如何编组/解组在 Go 中有两种不同格式的通用 JSON 和 BSON 键/字段?的主要内容,如果未能解决你的问题,请参考以下文章
json:无法将字符串解组为 MyMap.map 类型的 Go 值