IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Go Discussion :

Comment parser un JSON et afficher ses valeurs dont on ne connait pas à l'avance la structure


Sujet :

Go

  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 821
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 821
    Points : 979
    Points
    979
    Par défaut Comment parser un JSON et afficher ses valeurs dont on ne connait pas à l'avance la structure
    Bonjour,

    Je récupère via mon client HTTP un fichier JSON qui a ce format
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    {
            "error": null,
            "id": "tutu",
            "result": {
                    "param1": 559,
                    "param2": "yo"
     
            }
    }
    Actuellement, j'arrive à afficher la valeur de l'objet "result" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    var jsonObj map[string]interface{}
    jsonErr := json.Unmarshal(body, &jsonObj)
    if jsonErr == nil {
    	fmt.Println(jsonObj["result"])
    }
    Maintenant, j'aimerai pouvoir afficher les valeurs de "param1" et "param2". J'ai essayé ceci mais ça ne fonctionne pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fmt.Println(jsonObj["result"]["param2"])
    ... comment faire pour que ça fonctionne ?

    Je ne veux pas avoir à déclarer une structure comme c'est montré ici : https://riptutorial.com/go/example/4...-json-response
    => Je trouve que ce n'est pas très pratique à utiliser quand on est dans un cas où la structure JSON à parser peut être modifiée. Le système de récupération via des tableaux avec des clefs me convient beaucoup mieux.

  2. #2
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2022
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Israël

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Janvier 2022
    Messages : 4
    Points : 11
    Points
    11
    Par défaut
    Whoaaa Septembre 2021 !!!

    Bon je pense que tu n'a plus besoin de la réponse mais pour les autres la voici.

    Non c'est pas possible
    car map[string]interface{} renvoie une interface{} pour toute clé string
    or cette interface{} peut très bien de ne pas être un map, donc m["foo"]["bar"] <<< c'est pas possible.
    comment faire ? ben il faut caster
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        a:=map[string]interface{}{"toto":map[string]interface{}{"titi":"tutu"}}
        fmt.Println(a["toto"].(map[string]interface{})["titi"])   // print tutu
    Ouais c'est moche et unsafe

    j'ai codé ça https://gitlab.com/yehushua.ben.david/jsondynamic
    cela fait les casts automatiquements

    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    package main
    import (
    	"fmt"
    	jd "gitlab.com/yehushua.ben.david/jsondynamic"
    )
    func main() {
       jsonRaw := `{
            "error": null,
            "id": "tutu",
            "result": {
                    "param1": 559,
                    "param2": "yo"
            }
    }`
       j,_:=jd.JLoadString(jsonRaw)
       fmt.Println(jd.JGetString(j,"result.param2")) // print yo 
    }
    Enfin. Je comprends que des fois la structure du json soit changeante mais c'est pas l'esprit de Go.
    Il faut bien comprendre que le dynamique a une limite sauf quand c'est l'objectif (d’où mon jsondynamic)
    Il y a bien à un moment ou à une strate de votre système où l'on doit décider du contenu : je veux afficher le champ firstname !!
    Dans votre exemple c'est ici : fmt.Println(jsonObj["result"]["param2"]) << là vous décidez que le type de data est fixe !

    Alors pourquoi ne pas déclarer : (aller voir https://mholt.github.io/json-to-go/ y a quelques bugs mais c'est bien )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    type MonType struct {
    	Error  interface{} `json:"error"`
    	ID     string      `json:"id"`
    	Result struct {
    		Param1 int    `json:"param1"`
    		Param2 string `json:"param2"`
    	} `json:"result"`
    }
    Cordialement yehushua

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment parser du JSON en C avec GTK+ 3
    Par JeremTer dans le forum C
    Réponses: 3
    Dernier message: 22/02/2019, 11h00
  2. Comment parser du json
    Par nimed dans le forum jQuery
    Réponses: 1
    Dernier message: 12/11/2014, 04h09
  3. Réponses: 4
    Dernier message: 26/03/2014, 10h01
  4. [Vxi3] Afficher une valeur dont la date est max
    Par nannou86 dans le forum Deski
    Réponses: 1
    Dernier message: 27/08/2010, 14h47
  5. Comment lancer une appli sans afficher ses fiches
    Par raoulmania dans le forum Langage
    Réponses: 5
    Dernier message: 02/09/2005, 18h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo