Как я могу разобрать 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.
Я был бы признателен за это.
Ответы
Ответ 1
Чтобы перебрать многомерный массив, вы можете использовать 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
запускается в кодексе
Ответ 2
Я не могу поверить, что так много людей публикуют ответы, не прочитав должным образом JSON.
Если вы выполняете итерацию $json_a
в одиночку, у вас есть объект объектов. Даже если вы передадите true
в качестве второго параметра, у вас будет двумерный массив. Если вы просматриваете первое измерение, вы не можете просто повторить второе измерение таким образом. Так что это не так:
foreach ($json_a as $k => $v) {
echo $k, ' : ', $v;
}
Чтобы повторить статусы каждого человека, попробуйте следующее:
<?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'];
}
?>
Ответ 3
Самое элегантное решение:
$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;
Ответ 4
Try
<?php
$string = file_get_contents("/home/michael/test.json");
$json_a=json_decode($string,true);
foreach ($json_a as $key => $value){
echo $key . ':' . $value;
}
?>
Ответ 5
Это полностью вне меня, что никто не указал, что ваши "теги" вашего происхождения ошибочны. Вы создаете объект с {}, в то время как вы можете создать массив с [].
[ // <-- 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 будет анализироваться как массив вместо объекта. И с этим массивом вы можете делать все, что хотите, например, циклы и т.д.
Ответ 6
Попробуйте это
$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);
}
Ответ 7
Более стандартный ответ:
$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
Ответ 8
Проведите цикл через JSON с помощью цикла foreach
в качестве пар ключ-значение. Сделайте проверку типов, чтобы определить, нужно ли делать больше циклов.
foreach($json_a as $key => $value) {
echo $key;
if (gettype($value) == "object") {
foreach ($value as $key => $value) {
# and so on
}
}
}
Ответ 9
Try:
$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 />';
}
}
}
Ответ 10
<?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'];
?>
Ответ 11
Попробуйте:
foreach ($json_a as $key => $value)
{
echo $key, ' : ';
foreach($value as $v)
{
echo $v." ";
}
}
Ответ 12
Когда вы декодируете строку 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";
}
?>
Ответ 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>";
}
}
Ответ 14
Самый быстрый способ повторить все значения json - использовать цикл в цикле, первый цикл должен получить все объекты, а второй - значения...
foreach($data as $object) {
foreach($object as $value) {
echo $value;
}
}
Ответ 15
Из вашего опубликованного вопроса видно, что вас интересуют только status
столбца status
... независимо от ключей (имен) первого уровня.
PHP имеет специальную функцию для изоляции столбца данных в массиве.
Код: (Демо)
$json = '{
"John": {
"status":"Wait"
},
"Jennifer": {
"status":"Active"
},
"James": {
"status":"Active",
"age":56,
"count":10,
"progress":0.0029857,
"bad":0
}
}';
var_export(array_column(json_decode($json, true), 'status'));
Выход:
array (
0 => 'Wait',
1 => 'Active',
2 => 'Active',
)
Ответ 16
Вы должны сделать так:
echo $json_a['John']['status'];
echo "<>"
echo $json_a['Jennifer']['status'];
br inside <>
Что дает результат:
wait
active
Ответ 17
Я использую приведенный ниже код для преобразования json в массив в PHP
, если JSON действителен, тогда json_decode()
работает хорошо и вернет массив, но в случае искаженного JSON вернет NULL
,
<?php
function jsonDecode1($json){
$arr = json_decode($json, true);
return $arr;
}
// In case of malformed JSON, it will return NULL
var_dump( jsonDecode1($json) );
?>
Если в случае искаженного JSON вы ожидаете только массив, то вы можете использовать эту функцию,
<?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) );
?>
Если в случае искаженного JSON вы хотите остановить выполнение кода, вы можете использовать эту функцию,
<?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) );
?>