Problème avec Json

Petit nouveau ! | 6 Messages

09 nov. 2014, 22:29

Bonjour,
j'ai une chaine json à décoder qui est la suivante :

Code : Tout sélectionner

{ "response": { "players": [ { "steamid": "**********", "communityvisibilitystate": 3, "profilestate": 1, "personaname": "*****", "lastlogoff": *****, "profileurl": "http://steamcommunity.com/id/*****/", "avatar": "http://media.steampowered.com/steamcommunity/publ ic/images/****", "avatarmedium": "http://media.steampowered.com/steamcommunity/publ ic/images/******", "avatarfull": "http://media.steampowered.com/steamcommunity/publ ic/images/*****", "personastate": 1, "realname": "N/A", "primaryclanid": "********", "timecreated": ****, "personastateflags": 0 } ] } }
Et voici mon code pour récupérer "avatar"

Code : Tout sélectionner

$jr = json_decode($resultavatar, true); echo $jr->response->players->personaname;
Quelqu'un peut me dire où est le problème ? :(
Merci

ViPHP
ViPHP | 3607 Messages

09 nov. 2014, 23:56

Bonsoir,

Premièrement : on ne peut pas dire à ta place où est le problème...
C'est à toi de nous indiquer quel est le problème et ensuite on pourra éventuellement t'indiquer ou t'orienter vers une solution à ce problème !

Supposons que ton problème soit que tu n'arrives pas à afficher la variable "personaname".
As-tu essayé de debugger ton code ?

Quelque chose comme ça par exemple :
<?php

$jr = json_decode($resultavatar, true);

var_dump(
    $jr,
    $jr->response,
    $jr->response->players,
    $jr->response->players->personaname
);
Tu te rendras compte qu'il y a un problème sur la quatrième ligne du var_dump....

Je te laisse chercher ;)

Bon courage !

Petit nouveau ! | 6 Messages

10 nov. 2014, 18:04

Salut,
J'ai essayé de débugger mais j'ai du mal m'y prendre :|
Effectivement, la 4ème ligne me renvoie "NULL" mais je n'arrive pas à comprendre d'où viens le soucis. J'ai re fait la même chose avec une autre chaine json, tout allait bien :x

ViPHP
ViPHP | 3607 Messages

10 nov. 2014, 18:16

Bonjour,

Et que donne la troisième ligne ?
à priori quelque chose comme :

Code : Tout sélectionner

array(1) { [0]=> stdclass ...
Ce qui veut dire que $jr->response->players est un tableau.

Et comment accède-t-on aux entrées d'un tableau en php ?

Petit nouveau ! | 6 Messages

10 nov. 2014, 18:35

J'avais remarqué l'utilisation des tableaux, mais je n'y comprends rien, les deux premières variables sont des objets et la dernière un tableau ? 8-|
Oui je suis un boulet, désolé...

Petit nouveau ! | 6 Messages

11 nov. 2014, 19:30

Après plusieurs tentatives je n'arrive à rien, quelqu'un peux me donner des pistes ? :cry:

Mammouth du PHP | 571 Messages

11 nov. 2014, 20:22

$jr['response']['players'] étant un tableau,pour récupérer le 1er élément du tableau comme personaname:
   $jr = json_decode($resultavatar, true);
echo $jr['response']['players'][0]['personaname'];
Par itération, on peut récuperer tous les personaname(ou tous les autres éléments) du tableau $jr['response']['players'] :

foreach($jr['response']['players'] as $v ){
   echo $v['personaname'];
}


ViPHP
ViPHP | 3607 Messages

12 nov. 2014, 11:18

à priori yann18 ta réponse est fausse ;)
Les premiers éléments sont bien des objets.
Seulement l'entrée "players" est un tableau d'objets.

ça donnerait donc ceci :
var_dump($jr->response->players[0]->personaname);
où pour afficher tout les "players" :
foreach($jr->response->players as $player){
    var_dump($player->personaname);
}

Mammouth du PHP | 571 Messages

12 nov. 2014, 12:58

à priori yann18 ta réponse est fausse ;)
Les premiers éléments sont bien des objets.
Seulement l'entrée "players" est un tableau d'objets.
non je ne pense pas que ma réponse soit fausse.En passant true comme second paramètre de la fonction json_decode( ), le tableau d'objet est converti en tableau associatif: d'où ma notation tableau.

ViPHP
ViPHP | 3607 Messages

12 nov. 2014, 13:55

Effectivement :)

Mea culpa, mais alors dans ce cas là, soit SuGl1 teste bizarrement les var_dump...
Soit il a une version de php qui donne un autre résultat que le notre, soit le debug n'est pas du tout compris :)

car le code que j'ai donné précédemment donne null pour chaque argument (sauf le premier)...

bref....

Petit nouveau ! | 6 Messages

12 nov. 2014, 17:26

Bonjour,
désolé d'être aussi nul, mais que ce soit :

Code : Tout sélectionner

var_dump($jr->response->players[0]->personaname);
Ou :

Code : Tout sélectionner

foreach($jr->response->players as $player){ var_dump($player->personaname); }
Ca me renvoie NULL :(

Mammouth du PHP | 1967 Messages

12 nov. 2014, 17:28

Essaye le code de Yann18
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Petit nouveau ! | 6 Messages

12 nov. 2014, 17:42

Ah, merci, je ne l'avais pas vu :mrgreen:

Donc ce code marche parfaitement, merci beaucoup de votre aide !! :D
echo $jr['response']['players'][0]['personaname'];
Je suis un gros boulet, quelqu'un peut m'expliquer comment fonctionne ce code ? Je pensais que la réponse retournée était des objets :|

Mammouth du PHP | 571 Messages

12 nov. 2014, 22:52

la fonction json-decode renvoie un tableau d'objet que si le second paramètre est soit omis soit mis à false. Ce second paramètre étant optionnel, dans ton cas tu le mettais à true ce qui t'empêchais de récupérer un tableau d'objet.

L'exemple de jojolapine est bien juste à condition d'omettre le second paramètre ou de le mettre à faux:


   $jr = json_decode($resultavatar); // équivaut à    $jr = json_decode($resultavatar, false);
 foreach($jr->response->players as $player){
    var_dump($player->personaname);
}