Précédent   Forum des professionnels en informatique > PHP > Langage > Fonctions
Fonctions Forum d'entraide sur les fonctions PHP. Avant de poster -> FAQ fonctions et Sources diverses
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 27/11/2010, 11h23   #1
Futur Membre du Club
 
Inscription : février 2007
Messages : 42
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 42
Points : 19
Points : 19
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
leccux est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/11/2010, 11h43   #2
Expert Confirmé
 
Avatar de Séb.
 
Inscription : mars 2005
Messages : 2 815
Détails du profil
Informations personnelles :
Âge : 34
Localisation : France

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

Informations forums :
Inscription : mars 2005
Messages : 2 815
Points : 3 440
Points : 3 440
Citation:
je souhaite en plus que l'objet prenne en attribut, les valeurs du fichier json qu'il a désérialisé.
Genre :
Code :
$instance->attribut = $json->valeur ;
... donne plus de détails, je ne vois pas où est le pb.
__________________
Un problème exposé clairement est déjà à moitié résolu
Keep It Smart and Simple
Séb. est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/11/2010, 11h47   #3
Expert Confirmé
 
Avatar de RunCodePhp
 
Inscription : janvier 2010
Messages : 2 695
Détails du profil
Informations personnelles :
Localisation : Réunion

Informations forums :
Inscription : janvier 2010
Messages : 2 695
Points : 3 262
Points : 3 262
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 ?

Citation:
... 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.
__________________
Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]
RunCodePhp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/11/2010, 14h24   #4
Futur Membre du Club
 
Inscription : février 2007
Messages : 42
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 42
Points : 19
Points : 19
Merci à vous deux.

@Séb
En m'inspirant de ta réponse, j'ai essayé
Citation:
$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 :
1
2
3
$json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';
 
var_dump(json_decode($json));
Donnera:

Citation:
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).

Citation:
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.
leccux est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/11/2010, 14h48   #5
Expert Confirmé
 
Avatar de Séb.
 
Inscription : mars 2005
Messages : 2 815
Détails du profil
Informations personnelles :
Âge : 34
Localisation : France

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

Informations forums :
Inscription : mars 2005
Messages : 2 815
Points : 3 440
Points : 3 440
Citation:
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 :
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 :
1
2
3
4
5
Foo Object
(
    [fruit] => Pomme
    [couleur] => Vert
)
__________________
Un problème exposé clairement est déjà à moitié résolu
Keep It Smart and Simple
Séb. est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/11/2010, 11h41   #6
Futur Membre du Club
 
Inscription : février 2007
Messages : 42
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 42
Points : 19
Points : 19
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 :
$obj_merged = (object) array_merge((array) $obj1, (array) $obj2);
Mais ce n'est pas vraiment élégant.

Très proche de ta solution:
Code :
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?
leccux est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/11/2010, 18h33   #7
Membre éclairé
 
Inscription : octobre 2004
Messages : 235
Détails du profil
Informations forums :
Inscription : octobre 2004
Messages : 235
Points : 360
Points : 360
Ouch, es-tu sur de gagner en temps de traitement ? (ça semble être ta considération...)
Joker-eph est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/11/2010, 19h57   #8
Futur Membre du Club
 
Inscription : février 2007
Messages : 42
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 42
Points : 19
Points : 19
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?
leccux est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 21h58.


 
 
 
 
Partenaires

Hébergement Web