json_decode au tableau


422

J'essaie de décoder une chaîne JSON dans un tableau mais j'obtiens l'erreur suivante.

Erreur fatale: impossible d'utiliser un objet de type stdClass comme tableau dans C: \ wamp \ www \ temp \ asklaila.php sur la ligne 6

Voici le code:

<?php
$json_string = 'http://www.domain.com/jsondata.json';

$jsondata = file_get_contents($json_string);
$obj = json_decode($jsondata);
print_r($obj['Result']);
?>

1
Cela aurait fonctionné si vous y aviez accédé à la $ob->Resultplace.
lapin

Réponses:


839

Selon la documentation , vous devez spécifier si vous voulez un tableau associatif au lieu d'un objet de json_decode, ce serait le code:

json_decode($jsondata, true);

4
Cela soulève la question de savoir quels sont les avantages de le renvoyer sous forme de tableau et non d'objet?
Foxinni

52
Cela soulève la question. «Mendier une question» signifie assumer quelque chose qui reste à prouver ( réf .). Dans les deux cas, l'avantage pourrait être que l'OP est plus à l'aise pour parcourir des tableaux que des objets, ou qu'un autre code, déjà implémenté, nécessite un tableau.
jamesnotjim

8
@jamesnotjim L'implémentation par défaut qui renvoie un objet pourrait poser la question que les objets sont de meilleures valeurs de retour que les tableaux, n'est-ce pas?
David Mann

7
En effet, cela pourrait @DavidMann. Touché!
jamesnotjim

8
J'ajouterais le commentaire (bien que des années plus tard) qu'il n'y a aucune possibilité que JSON contienne autre chose que des données, ce qui en fait un choix "par défaut" confondant.
Barry

45

essaye ça

$json_string = 'http://www.domain.com/jsondata.json';
$jsondata = file_get_contents($json_string);
$obj = json_decode($jsondata,true);
echo "<pre>";
print_r($obj);

27

Il s'agit d'une contribution tardive, mais il existe un cas valable pour le casting json_decodeavec (array).
Considérer ce qui suit:

$jsondata = '';
$arr = json_decode($jsondata, true);
foreach ($arr as $k=>$v){
    echo $v; // etc.
}

Si $jsondataest jamais retourné sous forme de chaîne vide (comme dans mon expérience, il l'est souvent), json_decodesera renvoyé NULL, entraînant l'erreur Avertissement: argument non valide fourni pour foreach () sur la ligne 3 . Vous pouvez ajouter une ligne de code if / then ou un opérateur ternaire, mais IMO c'est plus propre de changer simplement la ligne 2 en ...

$arr = (array) json_decode($jsondata,true);

... à moins que vous json_decoden'utilisiez des millions de grands tableaux à la fois, auquel cas, comme le souligne @ TCB13, les performances pourraient être négativement affectées.



6

Selon la fonction de documentation PHP json_decode a un paramètre nommé assoc qui convertit les objets retournés en tableaux associatifs

 mixed json_decode ( string $json [, bool $assoc = FALSE ] )

Étant donné que le paramètre assoc est FALSEpar défaut, vous devez définir cette valeur sur TRUEafin de récupérer un tableau.

Examinez le code ci-dessous pour un exemple d'implication:

$json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';
var_dump(json_decode($json));
var_dump(json_decode($json, true));

qui génère:

object(stdClass)#1 (5) {
    ["a"] => int(1)
    ["b"] => int(2)
    ["c"] => int(3)
    ["d"] => int(4)
    ["e"] => int(5)
}

array(5) {
    ["a"] => int(1)
    ["b"] => int(2)
    ["c"] => int(3)
    ["d"] => int(4)
    ["e"] => int(5)
}

5

Cela le transformera également en tableau:

<?php
    print_r((array) json_decode($object));
?>

6
C'est un gaspillage de CPU / mémoire, comme l'a suggéré json_decode($object, true);le truefait exactement la même chose, en interne beaucoup plus rapidement.
TCB13

1
@ TCB13, sauf si vous avez besoin des deux et que vous ne voulez pas recommencer le décodage
Jimmy Kane

3
Soyez d'accord avec @JimmyKane. J'ai essayé et exécuté les deux versions dans un cycle; si vous avez besoin à la fois d'un objet et d'un tableau (même si cela devrait arriver rarement?), la json_decodeconversion + est 45% plus rapide que l'exécution des deux versions de json_decode. D'un autre côté, les deux sont si rapides qu'à moins d'avoir littéralement besoin de milliers de décodages, la différence est négligeable.
LSerni

4

json_decodeprend en charge le deuxième argument, lorsqu'il est défini sur TRUEil retournera un Arrayau lieu de stdClass Object. Consultez la page Manual de la json_decodefonction pour voir tous les arguments pris en charge et ses détails.

Par exemple, essayez ceci:

$json_string = 'http://www.example.com/jsondata.json';
$jsondata = file_get_contents($json_string);
$obj = json_decode($jsondata, TRUE); // Set second argument as TRUE
print_r($obj['Result']); // Now this will works!

3
json_decode($data, true); // Returns data in array format 

json_decode($data); // Returns collections 

Donc, si vous voulez un tableau, vous pouvez passer le deuxième argument en tant que «vrai» dans la json_decodefonction.


3

J'espère que cela t'aidera

$json_ps = '{"courseList":[  
            {"course":"1", "course_data1":"Computer Systems(Networks)"},  
            {"course":"2", "course_data2":"Audio and Music Technology"},  
            {"course":"3", "course_data3":"MBA Digital Marketing"}  
        ]}';

Utiliser la fonction de décodage Json

$json_pss = json_decode($json_ps, true);

Boucle sur un tableau JSON en php

foreach($json_pss['courseList'] as $pss_json)
{

    echo '<br>' .$course_data1 = $pss_json['course_data1']; exit; 

}

Résultat : systèmes informatiques (réseaux)


2

en PHP json_decode convertit les données json en tableau PHP associé
Pour Ex:$php-array= json_decode($json-data, true); print_r($php-array);


2

Veuillez essayer ceci

<?php
$json_string = 'http://www.domain.com/jsondata.json';

$jsondata = file_get_contents($json_string);
$obj = json_decode($jsondata, true);
echo "<pre>"; print_r($obj['Result']);
?>

2

Essayez comme ceci:

$json_string = 'https://example.com/jsondata.json';
$jsondata = file_get_contents($json_string);
$obj = json_decode($jsondata);
print_r($obj->Result);
foreach($obj->Result as $value){
  echo $value->id; //change accordingly
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.