J'essaie donc d'analyser une réponse JSON. Il peut s'agir de plusieurs niveaux de profondeur. C'est ce que j'ai fait:
var result map[string]interface{}
json.Unmarshal(apiResponse, &result)
Premièrement, est-ce la bonne façon de procéder?
Disons que la réponse était la suivante:
{
"args": {
"foo": "bar"
}
}
Pour accéder à la clé foo
, j'ai vu un terrain de je faire ceci:
result["args"].(map[string]interface{})["foo"]
Ici, quelle est la notation .()
? Est-ce correct?
La notation x.(T)
est appelée Type Assertion .
Pour une expression
x
de type interface et un typeT
, l'expression primairex.(T)
affirme quex
n'est pasnil
et que la valeur stockée dansx
est de typeT
.
Votre exemple:
result["args"].(map[string]interface{})["foo"]
Cela signifie que la valeur de votre carte results
associée à la clé "args"
est de type map[string]interface{}
(une autre carte avec les touches string
et toutes les valeurs). Et vous souhaitez accéder à l'élément de cette carte associé à la clé "foo"
.
Si vous savez noter le format JSON d'entrée, alors oui, vous devez utiliser un map[string]interface{}
tapez pour le traiter. Si vous connaissez la structure exacte du JSON d'entrée, vous pouvez créer un struct
pour faire correspondre les champs attendus, et ce faisant, vous pouvez démasquer un texte JSON en une valeur de votre type struct
personnalisé, par exemple:
type Point struct {
Name string
X, Y int
}
func main() {
in := `{"Name":"center","X":2,"Y":3}`
pt := Point{}
json.Unmarshal([]byte(in), &pt)
fmt.Printf("Result: %+v", pt)
}
Production:
Result: {Name:center X:2 Y:3}
Essayez-le sur le Go Playground .
Votre entrée JSON actuelle pourrait être modélisée avec ce type:
type Data struct {
Args struct {
Foo string
}
}
Et accéder à Foo
(essayez-le sur le Go Playground) :
d := Data{}
json.Unmarshal([]byte(in), &d)
fmt.Println("Foo:", d.Args.Foo)