web-dev-qa-db-fra.com

Accès à la carte imbriquée de type Map [string] interface {} à Golang

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?

17

La notation x.(T) est appelée Type Assertion .

Pour une expression x de type interface et un type T, l'expression primaire x.(T) affirme que x n'est pas nil et que la valeur stockée dans x est de type T.

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 .

Modélisation de votre entrée

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)
25
icza