не может распаковать массив в поле структуры Go Chats.metadata интерфейса типа map [string] - PullRequest
1 голос
/ 07 июня 2019

Я пытаюсь разобрать многомерный JSON.Мой JSON содержит динамический ключ, поэтому я не могу этого сделать.

JSON

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

Перейти к файлу

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)

1 Ответ

1 голос
/ 07 июня 2019

Если метаданные являются динамическими, то обрабатываются как interface{}.Если вы знаете, что это всегда будет контейнер JSON, тогда вы можете сделать map[string]interface{} для удобства.Существует также json.RawMessage, если вы не обязательно хотите использовать утверждения типа, чтобы увидеть, что внутри него, а просто хотите сохранить JSON (я предполагаю, что это то, что вы надеялись сделать, установив его в строку).

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"`
}
...