Estoy tratando de obtener un valor de un JSON y convertirlo en int, pero no funciona y no sé cómo hacerlo correctamente.
Aquí está el mensaje de error:
...cannot convert val (type interface {}) to type int: need type assertion
Y el codigo:
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
Supongo: si envió el valor JSON a través del navegador, cualquier número que envió será del tipo float64, por lo que no puede obtener el valor directamente int en golang.
Entonces haz la conversión como:
De esta forma puede obtener el valor exacto que deseaba.
fuente
Agregando otra respuesta que usa
switch
... Hay ejemplos más completos, pero esto le dará la idea.Por ejemplo, se
t
convierte en el tipo de datos especificado dentro de cadacase
ámbito. Tenga en cuenta que debe proporcionar uncase
solo para un tipo en un tipo; de lo contrario,t
sigue siendo uninterface
.fuente
case string
, puede usarstrconv.ParseFloat(t, 32)
y luegoint
Estoy totalmente de acuerdo con el tipo de respuesta de aserción de zzzz y prefiero firmemente esa forma sobre otras. Dicho esto, esto es lo que tuve que hacer cuando el método preferido no funcionó ... (larga historia relacionada con la serialización cruzada de datos). Incluso puede encadenar esto en una declaración con expresiones similares.
switch
case errInt == nil
Como dije anteriormente, primero intente escribir aserción antes de intentarlo de esta manera.
fuente
strconv.ParseFloat(v.(string), 64)
en su lugar. Es posible que también desee cambiar los nombres de las variables, por ejemploerrFloat
.Para comprender mejor la conversión de tipos, consulte el siguiente código:
Este código se ejecuta perfectamente y convierte el tipo de interfaz en tipo int
Volviendo a su código, este
iAreaId := val.(int)
debería funcionar bien. Si desea verificar que se produjo un error durante la conversión, también puede volver a escribir la línea anterior como
iAreaId, ok := val.(int)
fuente
Escribí una biblioteca que puede ayudar con las conversiones de tipos https://github.com/KromDaniel/jonson
fuente
La forma más sencilla en que hice esto. No es la mejor forma, pero la forma más sencilla que conozco.
fuente
Necesita hacer una aserción de tipo para convertir su interfaz {} a un valor int.
Hay más información disponible .
fuente
tal vez necesites
fuente
Es mejor evitar la conversión declarando que f es el tipo correcto para corresponder al JSON.
fuente