-2

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"}]
}

1 Answers1

5

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"}
}
Mayank Patel
  • 8,088
  • 5
  • 55
  • 75
  • And if you have other values that aren't strings, you can do `map[string]interface{}`, right? Or would that cause problems? –  May 07 '19 at 18:11
  • 1
    `map[string]interface{}` will work. However, it is only recommended if you do not know the structure of `data`. You should create a struct if you do. – Mayank Patel May 07 '19 at 18:14