web-dev-qa-db-ja.com

PHPでJSONファイルを解析する方法

私はPHPを使用してJSONファイルを解析しようとしました。しかし、私は今立ち往生しています。

これは私のJSONファイルの内容です:

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

これが私がこれまでに試したことです。

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

しかし、私は名前('John''Jennifer'のような)と利用可能なすべてのキーと値('age''count'のような)を前もって知らないので、foreachループを作成する必要があると思います。

私はこれのための例をいただければ幸いです。

360
John Doe

多次元配列を反復処理するには、 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";
    }
}

出力:

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

コードパッドで実行

303
Gordon

JSONを正しく読まずに多くの人が答えを投稿しているとは思えません。

$json_aを単独で反復処理すると予測した場合、オブジェクトのオブジェクトがあります。 2番目のパラメータとしてtrueを渡しても、2次元配列になります。最初の次元をループしているのであれば、2番目の次元をそのままエコーすることはできません。だからこれは間違っています:

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

各人の状態を反映するには、これを試してください。

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

?>
108
BoltClock

最もエレガントな解決策:

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

JsonファイルはBOMなしでUTF-8でエンコードする必要があることを忘れないでください。ファイルにBOMがある場合、json_decodeはNULLを返します。

あるいは

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

試します

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

あなたの最初の「タグ」が間違っていることをだれも指摘していないのは、私をはるかに超えています。あなたは{}でオブジェクトを作成していますが、[]で配列を作成することができます。

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

この変更により、JSONはオブジェクトではなく配列として解析されます。そしてその配列を使えば、ループなどのように、あなたが望むことなら何でもすることができます。

16
David

これを試して

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

試してください:

$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
Indrajeet Singh

より標準的な答え:

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

そして出力は次のとおりです。

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

キーと値のペアとしてforeachループを使用してJSONをループスルーします。さらにループを行う必要があるかどうかを判断するために型チェックを行います。

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

?>
3
sunny bhadania

それを試してみてください:

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

JSON文字列をデコードすると、オブジェクトが得られます。配列ではありません。だからあなたが得ている構造を見るための最良の方法は、デコードのvar_dumpを作ることです。 (このvar_dumpは、主に複雑な場合に構造を理解するのに役立ちます)。

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

すべてのJSON値をエコーする最も簡単な方法は、ループインループを使用することです。最初のループはすべてのオブジェクトを取得し、2番目のオブジェクトは値を取得します。

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