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.
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
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'];
}
?>
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;
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;
}
?>
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.
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); }
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 />';
}
}
}
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
}
}
}
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 ' '.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
Essayez-le:
foreach ($json_a as $key => $value)
{
echo $key, ' : ';
foreach($value as $v)
{
echo $v." ";
}
}
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";
}
?>
<?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'];
?>
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
$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>";
}
}
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;
}
}