Отображение строк для нескольких типов для json-объектов?

Я хочу создать карту, которую я могу преобразовать в объект json, например

{
   "a": "apple",
   "b": 2
}

но golang указывает, что карта должна быть объявлена ​​с помощью типов, поэтому я могу иметь строку [string] или map [string] int. Как создать объект json, как указано выше?

Примечание. Я не буду знать, какие данные и/или типы мне нужны до выполнения или когда мне нужно создать объект json. Поэтому я не могу просто создать объект вроде

type Foo struct {
    A string `json:"a"`
    B int `json:"b"`
}

Ответ 1

Вы всегда можете использовать interface{} для хранения любого типа. Поскольку в документации в пакете encoding/json говорится:

Чтобы размонтировать JSON в значение интерфейса, Unmarshal unmarshals JSON в конкретное значение, содержащееся в значении интерфейса. Если значение интерфейса равно nil, то есть не имеет конкретного значения, хранящегося в нем, Unmarshal сохраняет одно из них в значении интерфейса:

bool, для JSON booleans
float64, для номеров JSON
строка для строк JSON
[] интерфейс {}, для массивов JSON
map [string] interface {}, для объектов JSON
nil для JSON null

Просто выполните следующие действия:

m := map[string]interface{}{"a":"apple", "b":2}