我怎样才能parsing一个JSON文件与PHP?
我试图用PHPparsing一个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'
),我想我需要创build一些foreach循环。
我将不胜感激这个例子。
要遍历multidimensional array,可以使用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
在键盘上运行
我不能相信这么多人在没有正确阅读JSON的情况下发布答案。
如果你foreach遍历$json_a
单独,你有一个对象的对象。 即使你作为第二个参数传入,你也有一个二维数组。 如果你正在循环第一维,你不能像这样回声第二维。 所以这是错误的:
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']; } ?>
最优雅的解决scheme:
$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;
没有人指出你开始的“标签”是错的。 你用{}创build一个对象,而你可以用[]创build一个数组。
[ // <-- 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将被parsing为一个数组而不是一个对象。 而且用这个数组,你可以做任何你想要的,比如循环等
尝试
<?php $string = file_get_contents("/home/michael/test.json"); $json_a=json_decode($string,true); foreach ($json_a as $key => $value){ echo $key . ':' . $value; } ?>
尝试:
$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 />'; } } }
使用foreach
循环作为键值对循环浏览JSON。 进行types检查以确定是否需要执行更多的循环。
foreach($json_a as $key => $value) { echo $key; if (gettype($value) == "object") { foreach ($value as $key => $value) { # and so on } } }
尝试这个
$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); }
更多标准答案:
$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;
输出是:
Name: John Status = Wait Name: Jennifer Status = Active Name: James Status = Active Age = 56 Count = 10 Progress = 0.0029857 Bad = 0
尝试一下:
foreach ($json_a as $key => $value) { echo $key, ' : '; foreach($value as $v) { echo $v." "; } }
当你解码一个JSONstring时,你会得到一个对象。 不是一个数组。 所以看到你得到的结构的最好方法是做一个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"; } ?>
你必须这样给:
echo $json_a['John']['status']; echo "<>" echo $json_a['Jennifer']['status']; br inside <>
这给出了结果:
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>"; } }
回声所有JSON值的最快方法是使用循环,第一个循环将获得所有的对象,第二个值…
foreach($data as $object) { foreach($object as $value) { echo $value; } }