J'essaie d'obtenir une valeur d'un JSON et de la convertir en int, mais cela ne fonctionne pas et je ne sais pas comment le faire correctement.
Voici le message d'erreur:
...cannot convert val (type interface {}) to type int: need type assertion
Et le code:
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
Je suppose: si vous avez envoyé la valeur JSON via le navigateur, tout nombre que vous avez envoyé sera du type float64, vous ne pouvez donc pas obtenir la valeur directement int dans golang.
Alors faites la conversion comme:
De cette façon, vous pouvez obtenir la valeur exacte que vous vouliez.
la source
Ajout d'une autre réponse qui utilise
switch
... Il existe des exemples plus complets, mais cela vous donnera l'idée.Par exemple,
t
devient le type de données spécifié dans chaquecase
étendue. Remarque, vous devez fournir uncase
pour un seul type à un type, sinont
reste uninterface
.la source
case string
, vous pouvez utiliserstrconv.ParseFloat(t, 32)
puisint
Je suis entièrement d'accord avec la réponse d' affirmation de type de zzzz et je préfère fortement cette façon à d'autres. Cela dit, voici ce que j'ai dû faire lorsque la méthode préférée n'a pas fonctionné ... (longue histoire liée à la sérialisation croisée des données). Vous pouvez même l'enchaîner dans une instruction avec des expressions similaires.
switch
case errInt == nil
Comme je l'ai dit ci-dessus, essayez d' abord l' assertion de type avant d'essayer de cette façon.
la source
strconv.ParseFloat(v.(string), 64)
place. Vous pouvez également changer les noms de variables, par exempleerrFloat
.Pour mieux comprendre la conversion de type, regardez le code ci-dessous:
Ce code s'exécute parfaitement et convertit le type d'interface en type int
Revenons à votre code, ceci
iAreaId := val.(int)
devrait bien fonctionner. Si vous voulez vérifier l'erreur survenue lors de la conversion, vous pouvez également réécrire la ligne ci-dessus comme
iAreaId, ok := val.(int)
la source
J'ai écrit une bibliothèque qui peut aider avec les conversions de type https://github.com/KromDaniel/jonson
la source
La manière la plus simple que j'ai faite. Pas la meilleure façon mais la plus simple que je connaisse.
la source
Vous devez faire une assertion de type pour convertir votre interface {} en valeur int.
Plus d'informations sont disponibles .
la source
peut-être avez-vous besoin
la source
Il vaut mieux éviter le cast en déclarant f comme étant f le type correct pour correspondre au JSON.
la source