Como posso processar um ficheiro JSON com o PHP?

tentei processar um ficheiro JSON usando o PHP. Mas agora estou preso.

Este é o conteúdo do meu ficheiro JSON.
{
    "John": {
        "status":"Wait"
    },
    "Jennifer": {
        "status":"Active"
    },
    "James": {
        "status":"Active",
        "age":56,
        "count":10,
        "progress":0.0029857,
        "bad":0
    }
}
E foi isto que tentei até agora:
<?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];
Mas porque eu não sei os nomes'John', 'Jennifer') e todas as chaves e valores disponíveis (como 'age', 'count') de antemão, acho que preciso de criar um laço foreach.

Agradecia um exemplo para isto.

 322
Author: localheinz, 2010-12-03

15 answers

Para iterar sobre um array multidimensional, pode usar Recursivearrayiterador

$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";
    }
}

Resultado:

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

Correr no codepad

 287
Author: Gordon, 2016-02-27 12:58:43
Não acredito que há tanta gente a postar respostas sem ler o JSON como deve ser.

Se você for um iterate {[[2]} sozinho, você tem um objeto de objetos. Mesmo que você passe em true como segundo parâmetro, você tem um array bidimensional. Se você está fazendo looping através da primeira dimensão você não pode simplesmente ecoar a segunda dimensão assim. Então isto está errado.

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

Para ecoar os estatutos de cada pessoa, tente isto:

<?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
Author: BoltClock, 2010-12-03 08:22:42

A solução mais elegante:

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

Lembre-se que o ficheiro json tem de ser codificado em UTF-8 sem BOM. Se o arquivo tem BOM, então json_ decode retornará nulo.

Em alternativa:

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

Tenta

<?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
Author: Thariama, 2010-12-03 08:17:37
Está completamente fora de mim que ninguém tenha apontado que as tuas iniciais "etiquetas" estão erradas. Você está criando um objeto COM {}, enquanto você pode criar um array com [].
[ // <-- 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.

Com esta mudança, o json será processado como um array em vez de um objecto. E com essa matriz, você pode fazer o que quiser, como loops etc.

 13
Author: David, 2015-02-21 13:07:00

Tenta Isto

$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
Author: vivek, 2016-10-05 22:00:40

Tenta:

$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
Author: Indrajeet Singh, 2014-07-31 04:21:39

Circuito através do JSON com um laço foreach como pares de valores-chave. Faça a verificação de tipo para determinar se mais looping precisa ser feito.

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

Mais resposta padrão:

$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;

E a saída é:

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

Tenta.

foreach ($json_a as $key => $value)
 {
   echo $key, ' : ';
   foreach($value as $v)
   {
       echo $v."  ";
   }
}
 3
Author: Hamender, 2013-05-31 12:22:21
Quando descodificares uma cadeia de json, vais ter um objecto. não é uma matriz. Então a melhor maneira de ver a estrutura que você está recebendo, é fazer um var_dump do decodo. (este var_dump pode ajudá-lo a compreender a estrutura, principalmente em casos complexos).
<?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
Author: 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
Author: sunny bhadania, 2018-04-03 10:10:01

Tens que dar assim:

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

echo "<>"

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

br inside <>

O que dá o resultado:

wait
active
 0
Author: 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
Author: user3917016, 2014-11-19 04:59:07

A maneira mais rápida de ecoar todos os valores json é usando loop in loop, o primeiro loop vai obter todos os objetos e o segundo os valores...

foreach($data as $object) {

        foreach($object as $value) {

            echo $value;

        }

    }
 0
Author: The Bumpaster, 2016-07-29 09:18:03