如何编组/解组在 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 值

在 Golang 中解组 XML 时如何在 interface 中获取数据?

为啥 Go 中有两种声明变量的方式,有啥区别,用哪一种?

如何简化此解析方法?

在 Scala 中编组/解组 XML

JAXB 继承,解组到编组类的子类