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']);
?>
Harsha MV
la source
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);
Stephen
la source
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);
diEcho
la source
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.

neokio
la source
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)
}
Arosha De Silva
la source
5

Cela le transformera également en tableau:

<?php
    print_r((array) json_decode($object));
?>
coreyavis
la source
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!
Arjun Kariyadan
la source
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.

Shanu Singh
la source
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)

TechyFlick
la source
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);

Salman Mohammad
la source
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']);
?>
Dipali Sakle Systematix
la source
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
}
lalithkumar
la source