有没有办法使用 Go 将 JSON 字符串转换为 Mongo 扩展 JSON?



我有一个包含一些字符串的示例 JSON 正文。我希望将一些字符串转换为 Mongo 扩展 JSON。例如,传入的 JSON 正文如下所示:

{
"GuidBinary": "734cba69-4851-4869-8d0e-e870d6fb3065",
"DateTime": "12/12/2012",
"RegularString": "abcd"
}

我想把它转换成

{
"GuidBinary": {
"$binary": {
"base64": "<payload>",
"subType": 0x03
}
},
"DateTime": {"$date": "<ISO-8601 Date/Time Format>"},
"RegularString": "abcd"
}

有没有办法在 Go 中做到这一点,无论是通过像 mongo-go-driver 这样的包还是其他方法?

是的,这是可能的。这是官方mongo-go司机的一部分。生成此扩展 JSON将作为bson.MarshalExtJSON()函数发布。

使用它的示例:

m := map[string]interface{}{
"GuidBinary":    []byte{1, 2, 3, 4, 5},
"DateTime":      time.Now(),
"RegularString": "abcd",
}
out, err := bson.MarshalExtJSON(m, false, false)
fmt.Println(string(out), err)

这将输出(在Go Playground上尝试(:

{"DateTime":{"$date":"2009-11-10T23:00:00Z"},"RegularString":"abcd",
"GuidBinary":{"$binary":{"base64":"AQIDBAU=","subType":"00"}}} <nil>

所以你需要做的是取消封送你的原始JSON(使用encoding/json包(,你需要对它做一些后处理:GuidBinary是输入JSON中的常规字符串,但它代表一个UUID。您需要将其解析为 UUID 值(可能有很多库(。

您还需要转换(解析(DateTime该在输入中也作为 JSON 文本给出,但它表示日期。为此使用time.Parse()。现在,您可以调用bson.MarshalExtJSON()来生成扩展的 JSON。

最新更新