Как я могу проанализировать файл JSON с PHP?
Я попытался проанализировать файл JSON с помощью PHP. Но теперь я застрял.
это содержимое моего файла 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.
Я был бы признателен за пример для этого.
15 ответов:
для перебора многомерного массива можно использовать 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в одиночку, у вас есть объект объектов. Даже если вы проходите вtrueв качестве второго параметра, у вас есть двумерный массив. Если вы проходите через первое измерение, вы не можете просто повторить второе измерение. Так что это неправильно: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']; } ?>
элегантное решение:
$shipments = json_decode(file_get_contents("shipments.js"), true); print_r($shipments);помните, что json-файл должен быть закодирован в UTF-8 без спецификации. Если файл имеет спецификацию, то json_decode вернет значение NULL.
кроме того:
$shipments = json_encode(json_decode(file_get_contents("shipments.js"), true)); echo $shipments;
попробовать
<?php $string = file_get_contents("/home/michael/test.json"); $json_a=json_decode($string,true); foreach ($json_a as $key => $value){ echo $key . ':' . $value; } ?>
это совершенно за пределами меня, что никто не указал, что ваши начальные "теги" ошибочны. Вы создаете объект с помощью {}, в то время как вы можете создать массив с помощью [].
[ // <-- 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 будет проанализирован как массив вместо объекта. И с этим массивом вы можете делать все, что хотите, например, петли и т. д.
Попробуй Такое
$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); }
попробуй:
$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 />'; } } }
цикл через JSON с
foreachцикл как пары ключ-значение. Выполните проверку типов, чтобы определить, нужно ли делать больше циклов.foreach($json_a as $key => $value) { echo $key; if (gettype($value) == "object") { foreach ($value as $key => $value) { # and so on } } }
более стандартный ответ:
$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." "; } }
когда вы декодируете строку json, вы получите объект. не массив. Поэтому лучший способ увидеть структуру, которую вы получаете, - это сделать 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"; } ?>
<?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']; ?>
вы должны дать вот так:
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; } }
Comments