web-dev-qa-db-fra.com

Comment analyser un fichier JSON avec PHP?

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

Voici 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 voici 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'), je pense avoir besoin de créer une boucle foreach.

J'apprécierais un exemple pour cela.

374
John Doe

Pour parcourir 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écuté sur le codepad

310
Gordon

Je ne peux pas croire que tant de personnes postent des réponses sans lire le JSON correctement.

Si vous ne faites qu'itérer $json_a seul, vous avez un objet d'objets. Même si vous transmettez true comme deuxième paramètre, vous avez un tableau à deux dimensions. Si vous parcourez la première dimension, vous ne pouvez pas simplement faire écho à la deuxième dimension. 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");
if ($string === false) {
    // deal with error...
}

$json_a = json_decode($string, true);
if ($json_a === null) {
    // deal with error...
}

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

?>
111
BoltClock

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, json_decode retournera NULL.

Alternativement:

$shipments = json_encode(json_decode(file_get_contents("shipments.js"), true));
echo $shipments;
43
swift

Essayer

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

foreach ($json_a as $key => $value){
  echo  $key . ':' . $value;
}
?>
17
Thariama

Essaye ça

$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);
}
16
vivek

C'est complètement au-delà de moi que personne n'ait signalé que vos "balises" de départ sont fausses. 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 des boucles, etc.

16
David

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 le résultat est:

Name: John
 Status = Wait
Name: Jennifer
 Status = Active
Name: James
 Status = Active
 Age = 56
 Count = 10
 Progress = 0.0029857
 Bad = 0
9
Priyabrata Atha

Essayer:

$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 />';
        }
    }
}
8
Indrajeet Singh

Parcourez le JSON avec une boucle foreach sous forme de paires clé-valeur. Effectuez une vérification de type pour déterminer si davantage de boucles doivent être effectuées.

foreach($json_a as $key => $value) {
    echo $key;
    if (gettype($value) == "object") {
        foreach ($value as $key => $value) {
          # and so on
        }
    }
}
8
Alex
<?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']; 

?>
5
sunny bhadania

Essayez le:

foreach ($json_a as $key => $value)
 {
   echo $key, ' : ';
   foreach($value as $v)
   {
       echo $v."  ";
   }
}
3
Hamender

Lorsque vous décoderez une chaîne JSON, vous obtiendrez un objet. pas un tableau. La meilleure façon de voir la structure que vous obtenez est donc de créer un var_dump du décodage. (cette 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
Daniel Blanco

Le moyen le plus rapide de faire écho à toutes les valeurs JSON est d'utiliser boucle en boucle, la première boucle va récupérer tous les objets et la seconde les valeurs ...

foreach($data as $object) {

        foreach($object as $value) {

            echo $value;

        }

    }
0
The Bumpaster
$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
user3917016