有没有一种方法可以使用Go将JSON字符串转换为Mongo扩展JSON?

时间:2020-01-17 21:48:43

标签: json go mongo-go

我有一个包含一些字符串的示例JSON主体。我希望将某些字符串转换为Mongo Extended 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这样的软件包或其他方法来做到这一点?

1 个答案:

答案 0 :(得分:1)

是的,有可能。它是官方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,该bson.MarshalExtJSON()在输入中也以JSON文本形式提供,但它代表一个日期。为此使用time.Parse()。现在,您可以调用onPressed: () async{ AppData.updateCurrentLocation(); AppData.setNavDestination(widget._latitude, widget._longitude); AppData.setNavStatus(true); await AppData.setNewRoute(); setState(() { }); print("Current location is: " + AppData.getCurrentLocation().latitude.toString() + " , " + AppData.getCurrentLocation().longitude.toString()); print("Nav destination is: " + AppData.getNavDestination().latitude.toString()+ ", " + AppData.getNavDestination().longitude.toString()); Navigator.pop(context); //pop the bottomModalSheet Navigator.pushReplacement( context, new MaterialPageRoute( builder: (BuildContext context) => AppData.getTour(widget._tourID), ), ); }, 来生成扩展的JSON。