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

Langage PHP Discussion :

Objet désérialise JSON et y récupère ses attributs.


Sujet :

Langage PHP

  1. #1
    Nouveau membre du Club
    Inscrit en
    Février 2007
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 42
    Points : 30
    Points
    30
    Par défaut Objet désérialise JSON et y récupère ses attributs.
    Bonjour,

    Le problème semblait simple, mais finalement j'ai le plus grands mal à le résoudre.

    Mon dispatcher instancie un modèle (avec l'aide d'un autoload vers /models/classe.php). Les données de l'objet modèle sont dans un fichier JSON.

    J'aimerais que mon objet modèle "désérialise" le fichier json. ça c'est pas compliqué, mais je souhaite en plus que l'objet prenne en attribut, les valeurs du fichier json qu'il a désérialisé.

    Existe t il un moyen élégant de faire ça?
    Merci par avance

  2. #2
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 220
    Points : 8 456
    Points
    8 456
    Billets dans le blog
    17
    Par défaut
    je souhaite en plus que l'objet prenne en attribut, les valeurs du fichier json qu'il a désérialisé.
    Genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $instance->attribut = $json->valeur ;
    ... donne plus de détails, je ne vois pas où est le pb.

  3. #3
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    Salut

    Une fois délinéarisé, sous quel forme (ou type) sont les données ?
    Si c'est un tableau Php, ArrayOject me semble une solution, non ?

    ... mais je souhaite en plus que l'objet prenne en attribut, les valeurs du fichier json qu'il a désérialisé.
    J'ai pas tout compris non plus.
    Si les attributs prennent comme nom les valeurs, quels valeurs auront les attributs ?
    array_flip() permet d'intervertir les clés/valeurs d'un tableau.

  4. #4
    Nouveau membre du Club
    Inscrit en
    Février 2007
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 42
    Points : 30
    Points
    30
    Par défaut
    Merci à vous deux.

    @Séb
    En m'inspirant de ta réponse, j'ai essayé
    $this = json_decode($json);
    Mais ça ne semble pas donner les propriétés (les "clés" du JSON) à mon objet ni les valeurs.

    @RunCodePhp
    En théorie (si j'ai bien suivi) avec json_decode, un objet est créé. L'objet a les attribue des clés JSON et comme valeur les valeurs JSON.
    Pour reprendre l'exemple de la doc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';
     
    var_dump(json_decode($json));
    Donnera:

    object(stdClass)#1 (5) {
    ["a"] => int(1)
    ["b"] => int(2)
    ["c"] => int(3)
    ["d"] => int(4)
    ["e"] => int(5)
    }
    Mais contrairement à json_decode qui semble créer ex nihilo un objet, je voudrais que ce soit l'objet en cours qui reçoit de nouveaux attributs (issus du JSON).

    Si les attributs prennent comme nom les valeurs, quels valeurs auront les attributs ?
    Je pense que je me suis mal exprimé. Je voudrai que pour toute clé JSON, on ait un attribut du même nom. Et que la valeur de l'attribut soit la valeur de la clé JSON.

  5. #5
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 220
    Points : 8 456
    Points
    8 456
    Billets dans le blog
    17
    Par défaut
    Mais contrairement à json_decode qui semble créer ex nihilo un objet, je voudrais que ce soit l'objet en cours qui reçoit de nouveaux attributs (issus du JSON).
    Ok, regarde ceci :

    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
    18
    19
    20
    21
    <?php
     
    class Foo
    {
        public function importJSON($json)
        {
            $o = json_decode($json) ;
            foreach ( $o as $name => $value ) {
                $this->$name = $value ;
            }
        }
    }
     
    header('Content-Type: text/plain') ;
     
    $data = array('fruit' => 'Pomme', 'couleur' => 'Vert') ;
    $json = json_encode($data) ;
     
    $foo = new Foo( ) ;
    $foo->importJSON($json) ;
    print_r($foo) ;
    Donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Foo Object
    (
        [fruit] => Pomme
        [couleur] => Vert
    )

  6. #6
    Nouveau membre du Club
    Inscrit en
    Février 2007
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 42
    Points : 30
    Points
    30
    Par défaut
    Merci pour cette solution fonctionnelle.

    Le problème est qu'étant donné le contexte de l'application, cette solution pourrait être lourde. Et je n'arrive pas à me faire à l'idée qu'en PHP, il n'existe pas l'équivalent d'array merge pour les objets.

    Je travaille sur plusieurs pistes:

    Cette solution trouvée ailleurs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $obj_merged = (object) array_merge((array) $obj1, (array) $obj2);
    Mais ce n'est pas vraiment élégant.

    Très proche de ta solution:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    foreach($objectA as $k => $v) $objectB->$k = $v;
    Mais on a toujours le problème du temps de traitement si le JSON comporte beaucoup d'entrées.

    Enfin, une solution basée sur le patern composite. J'en ai trouvé quelques-unes sur le ouéb et ça permettrait de simplifier mon code:
    Le dispatcheur initialise le modèle et le contrôleur, le modèle crée un (ou des) objet(s) à partir du (ou des) JSON, le cas échéant le contrôleur ajoute les propriétés à l'objet modèle et enfin agrège l'objet modèle et l'objet issu du JSON.
    Que pensez-vous de cette solution? Cette interprétation du partage des rôles entre modèle et contrôleur est elle erronée?

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    329
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2004
    Messages : 329
    Points : 608
    Points
    608
    Par défaut
    Ouch, es-tu sur de gagner en temps de traitement ? (ça semble être ta considération...)

  8. #8
    Nouveau membre du Club
    Inscrit en
    Février 2007
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 42
    Points : 30
    Points
    30
    Par défaut
    Après tests, en fait non tu as raison.

    Je pense que j'en resterai à la boucle.

    À moins qu'il est possible d'ajouter des méthodes à un objet déjà instancié. Vous connaissez un moyen?

Discussions similaires

  1. Réponses: 3
    Dernier message: 01/06/2014, 22h23
  2. Parser un objet JSON sans connaitre ses attributs
    Par albert55 dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 03/07/2013, 17h07
  3. Réponses: 1
    Dernier message: 30/03/2011, 22h27
  4. Réponses: 5
    Dernier message: 12/01/2011, 21h15
  5. [Dojo] Récupérer un objet pour modifier ses attributs
    Par vermine dans le forum Bibliothèques & Frameworks
    Réponses: 14
    Dernier message: 03/02/2009, 11h53

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