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.