Hoe kan ik een JSON-bestand ontleden met PHP?

Ik heb geprobeerd een JSON-bestand te parseren met PHP. Maar ik zit nu vast.

Dit is de inhoud van mijn JSON-bestand:

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

En dit is wat ik tot nu toe heb geprobeerd:

<?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];

Maar omdat ik de namen (zoals 'John', 'Jennifer') en alle beschikbare sleutels en waarden (zoals 'age', 'count') vooraf, ik denk dat ik een foreach-lus moet maken.

Ik zou hier een voorbeeld van waarderen.


Antwoord 1, autoriteit 100%

Om een multidimensionale array te herhalen, kunt u 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";
    }
}

Uitvoer:

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

uitgevoerd op codepad


Antwoord 2, Autoriteit 44%

Ik kan niet geloven dat zoveel mensen antwoorden plaatsen zonder de JSON op de juiste manier te lezen.

Als u het foreachen annereert $json_aalleen, hebt u een object van objecten. Zelfs als u doorgeeft trueals de tweede parameter, heeft u een tweedimensionale array. Als je door de eerste dimensie loopt, kun je niet alleen de tweede dimensie echo. Dus dit is verkeerd:

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

Om de statussen van elke persoon te echelen, probeer dit dan:

<?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'];
}
?>

Antwoord 3, Autoriteit 16%

De meest elegante oplossing:

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

Vergeet niet dat het JSON-bestand moet worden gecodeerd in UTF-8 zonder BOM. Als het bestand BOM heeft, zal JSON_DECODE NULL retourneren.

Alternatief:

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

Antwoord 4, Autoriteit 9%

Probeer

<?php
$string = file_get_contents("/home/michael/test.json");
$json_a = json_decode($string,true);
foreach ($json_a as $key => $value){
  echo  $key . ':' . $value;
}
?>

Antwoord 5, autoriteit 5%

Het is mij een raadsel dat niemand erop heeft gewezen dat uw beginnende “tags” verkeerd zijn. U maakt een object met {}, terwijl u een array kunt maken met [].

[ // <-- 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.

Met deze wijziging wordt de json geparseerd als een array in plaats van als een object. En met die array kun je doen wat je wilt, zoals loops enz.


Antwoord 6, autoriteit 5%

Probeer dit

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

Antwoord 7, autoriteit 3%

Probeer:

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

Antwoord 8, autoriteit 3%

Meer standaardantwoord:

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

En de uitvoer is:

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

Antwoord 9, autoriteit 2%

Loop door de JSON met een foreach-lus als sleutel-waardeparen. Voer typecontrole uit om te bepalen of er meer looping moet worden gedaan.

foreach($json_a as $key => $value) {
    echo $key;
    if (gettype($value) == "object") {
        foreach ($value as $key => $value) {
          # and so on
        }
    }
}

Antwoord 10, autoriteit 2%

<?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']; 
?>

Antwoord 11

Probeer het:

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

Antwoord 12

Wanneer u een JSON-string decodeert, krijgt u een voorwerp. geen array. Dus de beste manier om de structuur te zien die je krijgt, is om een ​​var_dump van het decodeer te maken. (Deze var_dump kan u helpen de structuur te begrijpen, voornamelijk in complexe gevallen).

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

Antwoord 13

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

Antwoord 14

De snelste manier om te echo alle JSON-waarden gebruikt lus in lus, de eerste lus krijgt alle objecten en de tweede de waarden …

foreach($data as $object) {
        foreach($object as $value) {
            echo $value;
        }
    }

Antwoord 15

U moet dit geven:

echo  $json_a['John']['status']; 
echo "<>"
echo  $json_a['Jennifer']['status'];
br inside <>

Wat het resultaat geeft:

wait
active

Antwoord 16

Ik gebruik onderstaande code voor het converteren van json naar array in PHP,
Als JSON geldig is, werkt json_decode()goed, en retourneert het een array,
Maar in het geval van een verkeerd opgemaakte JSON zal het NULLteruggeven,

<?php
function jsonDecode1($json){
    $arr = json_decode($json, true);
    return $arr;
}
// In case of malformed JSON, it will return NULL
var_dump( jsonDecode1($json) );
?>

Als u in het geval van een misvormde JSON alleen array verwacht, kunt u deze functie gebruiken,

<?php
function jsonDecode2($json){
    $arr = (array) json_decode($json, true);
    return $arr;
}
// In case of malformed JSON, it will return an empty array()
var_dump( jsonDecode2($json) );
?>

Als u in het geval van een verkeerd opgemaakte JSON de uitvoering van de code wilt stoppen, kunt u deze functie gebruiken,

<?php
function jsonDecode3($json){
    $arr = (array) json_decode($json, true);
    if(empty(json_last_error())){
        return $arr;
    }
    else{
        throw new ErrorException( json_last_error_msg() );
    }
}
// In case of malformed JSON, Fatal error will be generated
var_dump( jsonDecode3($json) );
?>

Other episodes