Estou tentando obter um valor de um JSON e convertê-lo em int, mas não funciona e não sei como fazer isso corretamente.
Aqui está a mensagem de erro:
...cannot convert val (type interface {}) to type int: need type assertion
E o código:
var f interface{}
err = json.Unmarshal([]byte(jsonStr), &f)
if err != nil {
utility.CreateErrorResponse(w, "Error: failed to parse JSON data.")
return
}
m := f.(map[string]interface{})
val, ok := m["area_id"]
if !ok {
utility.CreateErrorResponse(w, "Error: Area ID is missing from submitted data.")
return
}
fmt.Fprintf(w, "Type = %v", val) // <--- Type = float64
iAreaId := int(val) // <--- Error on this line.
testName := "Area_" + iAreaId // not reaching here
Estou assumindo: se você enviou o valor JSON por meio do navegador, qualquer número enviado será do tipo float64, portanto, você não pode obter o valor diretamente em golang.
Então faça a conversão como:
Desta forma, você pode obter o valor exato que deseja.
fonte
Adicionando outra resposta que usa
switch
... Existem exemplos mais abrangentes por aí, mas isso lhe dará uma ideia.Por exemplo,
t
torna-se o tipo de dados especificado em cadacase
escopo. Observe que você deve fornecer umcase
para apenas um tipo em cada tipo, caso contrário,t
permanece uminterface
.fonte
case string
, você pode usarstrconv.ParseFloat(t, 32)
e, em seguida, lançar o resultado para umint
Eu concordo plenamente com a resposta de afirmação de tipo de zzzz e prefiro fortemente essa forma a outras. Dito isso, aqui está o que tive de fazer quando o método preferido não funcionou ... (longa história relacionada à serialização cruzada de dados). Você pode até mesmo encadear isso em uma
switch
declaração comcase errInt == nil
expressões semelhantes.Como eu disse acima, tente digitar a asserção antes de tentar dessa forma.
fonte
strconv.ParseFloat(v.(string), 64)
vez disso. Você pode querer alterar os nomes das variáveis também, por exemploerrFloat
.Para entender melhor a conversão de tipo, observe o código abaixo:
Este código executa perfeitamente e converte o tipo de interface em tipo interno
Voltando ao seu código, este
iAreaId := val.(int)
deve funcionar bem. Se você quiser verificar o erro ocorrido durante a conversão, você também pode reescrever a linha acima como
iAreaId, ok := val.(int)
fonte
Eu escrevi uma biblioteca que pode ajudar com conversões de tipo https://github.com/KromDaniel/jonson
fonte
Maneira mais simples de fazer isso. Não é a melhor maneira, mas a maneira mais simples que conheço.
fonte
Você precisa fazer uma declaração de tipo para converter sua interface {} para o valor int.
Mais informações disponíveis .
fonte
talvez você precise
fonte
Melhor evitar a conversão declarando f como o tipo correto para corresponder ao JSON.
fonte