При демонтаже объекта json
в map
или interface
всегда будет использоваться map[string]interface{}
для демаршализации объекта JSON (как отмечено в его ответе beiping96).
Используйте reflect.TypeOf
, чтобы увидеть, какой тип содержит переменная. Вы можете только привести к этому типу. Если вы хотите другой тип, вам нужно конвертировать it.
Вот пример, чтобы добраться до map[string]string
:
func main() {
data := `{"1":"2", "3": "4"}`
var v interface{}
if err := json.Unmarshal([]byte(data), &v); err != nil {
log.Fatal(err)
}
var res = map[string]string{}
for k, v := range v.(map[string]interface{}) {
res[k] = v.(string)
}
fmt.Println(reflect.TypeOf(res), res)
}
Примечание: я предполагаю, что структура известна, и я не проверяю типы. Это вызовет панику, если типы не соответствуют предполагаемым. Используйте шаблон val, ok := ...
, который вы использовали для предотвращения паники.
Однако вышеприведенное не является идиоматическим способом UnMarshal к map[string]string
Обычным способом (если вы знаете структуру строки JSON) было бы позволить пакету json
иметь дело с приведением типа:
func main() {
data := `{"1":"2", "3": "4"}`
var res map[string]string
if err := json.Unmarshal([]byte(data), &res); err != nil {
log.Fatal(err)
}
fmt.Println(reflect.TypeOf(res), res)
}