Как я могу прочитать этот JSON с помощью PHP? [dубликат]

Я попытался разобрать 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. [ ! d3]

Я был бы признателен за это.

313
задан 7 September 2017 в 16:05

14 ответов

Проведите цикл через JSON с петлей foreach в качестве пар ключ-значение. Проверьте тип, чтобы определить, нужно ли делать больше циклов.

foreach($json_a as $key => $value) {
    echo $key;
    if (gettype($value) == "object") {
        foreach ($value as $key => $value) {
          # and so on
        }
    }
}
7
ответ дан 15 August 2018 в 17:03
  • 1
    Или еще лучше, знаете, что такое структура заранее. – Ignacio Vazquez-Abrams 3 December 2010 в 12:23

Я не могу поверить, что многие люди публикуют ответы, не читая JSON должным образом.

Если вы хотите использовать итерацию $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'];
}

?>
93
ответ дан 15 August 2018 в 17:03
  • 1
    Если файлы php и json находятся в одном каталоге, мы можем прочитать json с file_get_contents("test.json"); (не нужно указывать путь). – Chetabahana 16 April 2015 в 12:55

Попробуйте:

$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 />';
        }
    }
}
8
ответ дан 15 August 2018 в 17:03

Когда вы декодируете строку 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
ответ дан 15 August 2018 в 17:03

Это совершенно вне меня, что никто не указал, что ваши «теги» вашего происхождения ошибочны. Вы создаете объект с {}, в то время как вы можете создать массив с [].

[ // <-- 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 будет анализироваться как массив вместо объекта. И с этим массивом вы можете делать все, что хотите, например, циклы и т. Д.

13
ответ дан 15 August 2018 в 17:03
  • 1
    Вы правы, указав массив. – Stephen Adelakun 23 August 2016 в 11:40
  • 2
    О, мой. Я должен добавить, что вы, похоже, удалили ключ в js-файле OP при преобразовании в массив. Таким образом, OP прав. – Stephen Adelakun 23 August 2016 в 11:51
  • 3
    «Но поскольку я не знаю имен (таких как Джон, Дженнифер) и всех доступных ключей». Кажется, он не знает ключей, поэтому единственный способ пересечь коллекцию - это цикл. Этот тип говорит мне, что он не направляет доступ к значениям по ключу. – David 24 August 2016 в 22:25

Вы должны дать так:

echo  $json_a['John']['status']; 

echo "<>"

echo  $json_a['Jennifer']['status'];

br inside <>

Что дает результат:

wait
active
0
ответ дан 15 August 2018 в 17:03

Попробуйте:

foreach ($json_a as $key => $value)
 {
   echo $key, ' : ';
   foreach($value as $v)
   {
       echo $v."  ";
   }
}
4
ответ дан 15 August 2018 в 17:03

Более стандартный ответ:

$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
7
ответ дан 15 August 2018 в 17:03
[F1]
0
ответ дан 15 August 2018 в 17:03

Самое элегантное решение:

$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;
33
ответ дан 15 August 2018 в 17:03
  • 1
    Довольно удивительно, но вся вещь Билля Материалов (BOM) меня совершенно смущает. э ... что ты говоришь? Разве я единственный парень, который махал при использовании загадочных необъяснимых сокращений? Хорошо использовать аббревиатуры, но, пожалуйста, объясните, когда первый используется (WFU) ... спасибо. – zipzit 12 February 2015 в 05:26
  • 2
    BOM = знак порядка байтов. – swift 2 March 2015 в 13:35
  • 3
    ru.wikipedia.org/wiki/Byte_order_mark Типичный результат, если вы работаете с json на Mac и ПК, поскольку они используют разные текстовые форматы по умолчанию. – swift 2 March 2015 в 13:41

Попробуйте

<?php
$string = file_get_contents("/home/michael/test.json");
$json_a=json_decode($string,true);

foreach ($json_a as $key => $value){
  echo  $key . ':' . $value;
}
?>
16
ответ дан 15 August 2018 в 17:03

Самый быстрый способ повторить все значения json - использовать цикл в цикле, первый цикл будет получать все объекты, а второй - значения ...

foreach($data as $object) {

        foreach($object as $value) {

            echo $value;

        }

    }
0
ответ дан 15 August 2018 в 17:03
[F1]
1
ответ дан 15 August 2018 в 17:03
  • 1
    Хия, это вполне может решить проблему ... но было бы хорошо, если бы вы могли отредактировать свой ответ и дать немного больше объяснений о том, как и почему это работает :) Не забывайте - есть кучи новичков в переполнении стека , и они могли бы узнать кое-что из вашего опыта - что очевидно для вас, возможно, не так для них. – Taryn East 19 November 2014 в 09:37

Попробуйте это

$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);
}
10
ответ дан 15 August 2018 в 17:03

Другие вопросы по тегам:

Похожие вопросы: