如何将以下划线开头的字段封送到JSON[Golang]

如何将以下划线开头的字段封送到JSON[Golang],json,mongodb,go,Json,Mongodb,Go,Go的encoding/json包具有一些出色的json编组功能,无论出于何种目的,它都正是我所需要的。但是当我想要尝试并封送我想要插入到MongoDB实例中的东西时,问题就出现了 MongoDB将\u id理解为索引标识符,但Go的JSON包仅封送导出的字段,因此MongoDB在保存文档时为文档创建自己的id,我不希望这样,我甚至还没有开始测试它将对结构进行解组的含义 有没有一种方法可以使JSON封送器包含以下划线开头的字段,而不必编写一个全新的字段?您可以轻松地重命名字段。Go名称应该以要导

Go的
encoding/json
包具有一些出色的json编组功能,无论出于何种目的,它都正是我所需要的。但是当我想要尝试并封送我想要插入到MongoDB实例中的东西时,问题就出现了

MongoDB将
\u id
理解为索引标识符,但Go的JSON包仅封送导出的字段,因此MongoDB在保存文档时为文档创建自己的id,我不希望这样,我甚至还没有开始测试它将对结构进行解组的含义


有没有一种方法可以使JSON封送器包含以下划线开头的字段,而不必编写一个全新的字段?

您可以轻松地重命名字段。Go名称应该以要导出的大写字母开头,但json名称可以是任何与json兼容的名称

下面是一个借用到encoding/json包文档的示例:

 package main

import (
    "encoding/json"
    "fmt"
    "os"
)

func main() {
    type ColorGroup struct {
        ID     int       `json:"_id"`
        Name   string
        Colors []string
    }
    group := ColorGroup{
        ID:     1,
        Name:   "Reds",
        Colors: []string{"Crimson", "Red", "Ruby", "Maroon"},
    }
    b, err := json.Marshal(group)
    if err != nil {
        fmt.Println("error:", err)
    }
    os.Stdout.Write(b)
}

我对这里的语法有点困惑(只有几个月的围棋编程)。如果您将字符串放在ID字段后面的反勾号中,那么这实际上只是告诉封送拆收器重命名字段吗?它是与字段关联的标记,由封送拆收器引擎解码。封送处理程序将只使用“json:”后面的名称作为json键。