如何解映射类型为map [string] interface的Go结构字段

I am trying to unmarshall multidimensional JSON. My JSON is contains dynamic key therefore I can't do it.

JSON

    {
      "id":"3",
      "datetime":"2019-06-08",
      "metadata":[{"a":"A"},{"b":"B"}]
    }

Go file

type Chats struct {
    Id          string json:"id"
    Datetime    string json:"date"
    Metadata  string json:"metadata"
}


chat := models.Chats{}
err := c.BindJSON(&chat)
if err != nil {
    c.Error(err)
    return
}
fmt.Println(chat)

If metadata is dynamic then treat is as an interface{}. If you know it's always going to be a JSON container then you could do map[string]interface{} for convenience. There is also json.RawMessage if you don't necessarily want to use type assertions to see what's inside of it, but just want to preserve the JSON (I'm guessing this is what you were hoping to do by setting it to string).

type Chats struct {
    Id          string      `json:"id"`
    Datetime    string      `json:"date"`
    Metadata    interface{} `json:"metadata"`
}
type Chats struct {
    Id          string                 `json:"id"`
    Datetime    string                 `json:"date"`
    Metadata    map[string]interface{} `json:"metadata"`
}
type Chats struct {
    Id          string          `json:"id"`
    Datetime    string          `json:"date"`
    Metadata    json.RawMessage `json:"metadata"`
}