Search code examples
gobsonmongo-go

How can I get JSON from BSON without my keys all being named "Key"?


I'm trying to read from a database and then return the result to the user as json.

What's happening is that I'm getting output like:
[{"Key":"foo","Value":"bar"}]

When I would like to get:
"{"foo":"bar"}"

How do I get the former?

Example: (reading from the db and converting Raw to string are not shown)

package main

import (
    "encoding/json"
    "fmt"

    "go.mongodb.org/mongo-driver/bson"
)

func main() {

    var data = "{\"foo\":\"bar\"}"
    var testInterface interface{}
    e := bson.UnmarshalExtJSON([]byte(data), false, &testInterface)
    if e != nil {
        fmt.Println("err is ", e)
    }
    out, _ := json.Marshal(testInterface)
    fmt.Println(string(out))
    // prints: [{"Key":"foo","Value":"bar"}]
}

Solution

  • You need to provide a map instead of an interface to get value as a key-value pair.

    Try:

    package main
    
    import (
        "encoding/json"
        "fmt"
    
        "go.mongodb.org/mongo-driver/bson"
    )
    
    func main() {
    
        var data = "{\"foo\":\"bar\"}"
        var testInterface map[string]string
        e := bson.UnmarshalExtJSON([]byte(data), false, &testInterface)
        if e != nil {
            fmt.Println("err is ", e)
        }
    
        out, _ := json.Marshal(testInterface)
        fmt.Println(string(out))
        // prints: {"foo":"bar"}
    }