Перейти конвертировать интерфейс {} на карту - PullRequest
0 голосов
/ 19 апреля 2019

Я конвертирую интерфейс {} для отображения строки [string].

package main

import (
    "encoding/json"
    "fmt"
)

func main() {
    data := `{"1":"2", "3": "4"}`
    var v interface{}
    json.Unmarshal([]byte(data), &v)
    fmt.Printf("%+v\n", v)
    _, ok := v.(map[string]interface{})
    fmt.Printf("%v\n", ok)
    _, ok = v.(map[string]string)
    fmt.Printf("%v\n", ok)
    _, ok = v.(map[interface{}]interface{})
    fmt.Printf("%v\n", ok)
}

Код здесь https://play.golang.org/p/I_clyMdaGzw

почему map [string] interface {} в порядке ,, но map [string] string, map [interface {}] interface {} не работает?

Ответы [ 2 ]

2 голосов
/ 20 апреля 2019

При демонтаже объекта 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)
}
2 голосов
/ 19 апреля 2019

https://godoc.org/encoding/json#Unmarshal

To unmarshal JSON into an interface value, Unmarshal stores one of these in the interface value:

bool, for JSON booleans
float64, for JSON numbers
string, for JSON strings
[]interface{}, for JSON arrays
map[string]interface{}, for JSON objects
nil for JSON null

, поскольку для декодирования используется interface{}, тип объектов json по умолчанию: map[string]interface{}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...