Comment puis-je analyser un fichier JSON avec PHP?

J'ai essayé d'analyser un fichier JSON en utilisant PHP. Mais je suis coincé maintenant.

C'est le contenu de mon fichier JSON:

{
    "John": {
        "status":"Wait"
    },
    "Jennifer": {
        "status":"Active"
    },
    "James": {
        "status":"Active",
        "age":56,
        "count":10,
        "progress":0.0029857,
        "bad":0
    }
}

Et c'est ce que j'ai essayé jusqu'à présent:

<?php

$string = file_get_contents("/home/michael/test.json");
$json_a = json_decode($string, true);

echo $json_a['John'][status];
echo $json_a['Jennifer'][status];

Mais parce que je ne connais pas les noms (comme 'John', 'Jennifer') et toutes les clés et valeurs disponibles (comme 'age', 'count') au préalable, je pense que je dois créer une boucle foreach.

J'apprécierais un exemple pour cela.

322
demandé sur localheinz 2010-12-03 11:11:32

15 réponses

Boucle sur un tableau multidimensionnel, vous pouvez utiliser RecursiveArrayIterator

$jsonIterator = new RecursiveIteratorIterator(
    new RecursiveArrayIterator(json_decode($json, TRUE)),
    RecursiveIteratorIterator::SELF_FIRST);

foreach ($jsonIterator as $key => $val) {
    if(is_array($val)) {
        echo "$key:\n";
    } else {
        echo "$key => $val\n";
    }
}

Sortie:

John:
status => Wait
Jennifer:
status => Active
James:
status => Active
age => 56
count => 10
progress => 0.0029857
bad => 0

Exécuter sur codepad

287
répondu Gordon 2016-02-27 12:58:43

Je n'arrive pas à croire que tant de gens publient des réponses sans lire correctement le JSON.

Si vous foreach itérer $json_a seul, vous avez un objet d'objets. Même si vous passez true comme deuxième paramètre, vous avez un tableau à deux dimensions. Si vous faites une boucle à travers la première dimension, Vous ne pouvez pas simplement faire écho à la deuxième dimension comme ça. Donc c'est faux:

foreach ($json_a as $k => $v) {
   echo $k, ' : ', $v;
}

Pour faire écho aux Statuts de chaque personne, essayez ceci:

<?php

$string = file_get_contents("/home/michael/test.json");
$json_a = json_decode($string, true);

foreach ($json_a as $person_name => $person_a) {
    echo $person_a['status'];
}

?>
93
répondu BoltClock 2010-12-03 08:22:42

La solution La plus élégante:

$shipments = json_decode(file_get_contents("shipments.js"), true);
print_r($shipments);

Rappelez-vous que le fichier json doit être encodé en UTF-8 sans nomenclature. Si le fichier a une nomenclature, alors json_decode retournera NULL.

Sinon:

$shipments = json_encode(json_decode(file_get_contents("shipments.js"), true));
echo $shipments;
33
répondu swift 2014-12-17 13:35:59

Essayez

<?php
$string = file_get_contents("/home/michael/test.json");
$json_a=json_decode($string,true);

foreach ($json_a as $key => $value){
  echo  $key . ':' . $value;
}
?>
16
répondu Thariama 2010-12-03 08:17:37

C'est complètement au-delà de moi que personne n'a souligné que vos "tags" initiaux sont faux. Vous créez un objet avec {}, alors que vous pouvez créer un tableau avec [].

[ // <-- Note that I changed this
    {
        "name" : "john", // And moved the name here.
        "status":"Wait"
    },
    {
        "name" : "Jennifer",
        "status":"Active"
    },
    {
        "name" : "James",
        "status":"Active",
        "age":56,
        "count":10,
        "progress":0.0029857,
        "bad":0
    }
] // <-- And this.

Avec cette modification, le json sera analysé comme un tableau au lieu d'un objet. Et avec ce tableau, vous pouvez faire ce que vous voulez, comme les boucles etc.

13
répondu David 2015-02-21 13:07:00

Essayez Ceci

$json_data = '{
"John": {
    "status":"Wait"
},
"Jennifer": {
    "status":"Active"
},
"James": {
    "status":"Active",
    "age":56,
    "count":10,
    "progress":0.0029857,
    "bad":0
  }
 }';

 $decode_data = json_decode($json_data);
foreach($decode_data as $key=>$value){

        print_r($value);
}
10
répondu vivek 2016-10-05 22:00:40

Essayez:

$string = file_get_contents("/home/michael/test.json");
$json = json_decode($string, true);

foreach ($json as $key => $value) {
    if (!is_array($value)) {
        echo $key . '=>' . $value . '<br />';
    } else {
        foreach ($value as $key => $val) {
            echo $key . '=>' . $val . '<br />';
        }
    }
}
9
répondu Indrajeet Singh 2014-07-31 04:21:39

Parcourez le JSON avec une boucle foreach en tant que paires clé-valeur. Effectuez une vérification de type pour déterminer si une boucle supplémentaire doit être effectuée.

foreach($json_a as $key => $value) {
    echo $key;
    if (gettype($value) == "object") {
        foreach ($value as $key => $value) {
          # and so on
        }
    }
}
7
répondu Alex 2010-12-03 08:19:02

Réponse plus standard:

$jsondata = file_get_contents(PATH_TO_JSON_FILE."/jsonfile.json");

$array = json_decode($jsondata,true);

foreach($array as $k=>$val):
    echo '<b>Name: '.$k.'</b></br>';
    $keys = array_keys($val);
    foreach($keys as $key):
        echo '&nbsp;'.ucfirst($key).' = '.$val[$key].'</br>';
    endforeach;
endforeach;

Et la sortie est:

Name: John
 Status = Wait
Name: Jennifer
 Status = Active
Name: James
 Status = Active
 Age = 56
 Count = 10
 Progress = 0.0029857
 Bad = 0
7
répondu Priyabrata Atha 2016-08-03 07:53:06

Essayez-le:

foreach ($json_a as $key => $value)
 {
   echo $key, ' : ';
   foreach($value as $v)
   {
       echo $v."  ";
   }
}
3
répondu Hamender 2013-05-31 12:22:21

Lorsque vous décodez une chaîne json, vous obtiendrez un objet. pas un tableau. Donc, la meilleure façon de voir la structure que vous obtenez, est de faire un var_dump de le décoder. (ce var_dump peut vous aider à comprendre la structure, principalement dans les cas complexes).

<?php
     $json = file_get_contents('/home/michael/test.json');
     $json_a = json_decode($json);
     var_dump($json_a); // just to see the structure. It will help you for future cases
     echo "\n";
     foreach($json_a as $row){
         echo $row->status;
         echo "\n";
     }
?>
1
répondu Daniel Blanco 2014-08-25 01:08:42
<?php
$json = '{
    "response": {
        "data": [{"identifier": "Be Soft Drinker, Inc.", "entityName": "BusinessPartner"}],
        "status": 0,
        "totalRows": 83,
        "startRow": 0,
        "endRow": 82
    }
}';
$json = json_decode($json, true);
//echo '<pre>'; print_r($json); exit;
echo $json['response']['data'][0]['identifier'];
$json['response']['data'][0]['entityName']
echo $json['response']['status']; 
echo $json['response']['totalRows']; 
echo $json['response']['startRow']; 
echo $json['response']['endRow']; 

?>
1
répondu sunny bhadania 2018-04-03 10:10:01

Vous devez donner comme ceci:

echo  $json_a['John']['status']; 

echo "<>"

echo  $json_a['Jennifer']['status'];

br inside <>

Qui donne le résultat :

wait
active
0
répondu muneeb 2012-01-26 16:38:21
$json_a = json_decode($string, TRUE);
$json_o = json_decode($string);



foreach($json_a as $person => $value)
{
    foreach($value as $key => $personal)
    {
        echo $person. " with ".$key . " is ".$personal;
        echo "<br>";
    }

}
0
répondu user3917016 2014-11-19 04:59:07

Le moyen le plus rapide d'echo toutes les valeurs json est d'utiliser loop in loop, la première boucle va obtenir tous les objets et la seconde les valeurs...

foreach($data as $object) {

        foreach($object as $value) {

            echo $value;

        }

    }
0
répondu The Bumpaster 2016-07-29 09:18:03