PHP: разбираем JSON
как преобразовать данные JSON с помощью php
Независимо от того, каким образом получены данные в формате JSON: в виде файла *.json
переданного из стороннего API или входящей строки, нативный PHP, начиная с версии 5.2.0, предоставляет две замечательные функции json_encode
и json_decode
. Сегодня мы обратим внимание на функцию json_decode
, которая позволяет преобразовать данные JSON в формат, пригодный для дальнейшей работы.
Итак, для начала нам нужны какие-то JSON-данные, и мы получим их, благодаря генератору случайных данных Mockaroo.
Например,такие:
[{
"id": 1,
"first_name": "Bertrando",
"last_name": "Pedrollo",
"email": "[email protected]",
"gender": "Male",
"ip_address": "62.137.20.86"
}, {
"id": 2,
"first_name": "Pier",
"last_name": "Winkworth",
"email": "[email protected]",
"gender": "Female",
"ip_address": "158.139.30.200"
}, {
"id": 3,
"first_name": "Joyous",
"last_name": "Glascott",
"email": "[email protected]",
"gender": "Female",
"ip_address": "146.147.52.106"
}, {
"id": 4,
"first_name": "Daniela",
"last_name": "Hawes",
"email": "[email protected]",
"gender": "Female",
"ip_address": "148.153.203.134"
}]
json_decode
Преобразование JSON в объект
Входящие JSON-данные всгеда являются строкой, как же их преобразовать? Посмотрим на код приведенный ниже:
$json = '[{ "id": 1, "first_name": "Bertrando", "last_name": "Pedrollo", "email": "[email protected]", "gender": "Male", "ip_address": "62.137.20.86" }, { "id": 2, "first_name": "Pier", "last_name": "Winkworth", "email": "[email protected]", "gender": "Female", "ip_address": "158.139.30.200" }, { "id": 3, "first_name": "Joyous", "last_name": "Glascott", "email": "[email protected]", "gender": "Female", "ip_address": "146.147.52.106" }, { "id": 4, "first_name": "Daniela", "last_name": "Hawes", "email": "[email protected]", "gender": "Female", "ip_address": "148.153.203.134" }]';
$decodedJson = json_decode($json);
var_dump($decodedJson);
После преобразования JSON-данных с помощью функции json_decode
, мы вывели их на странцу. Можно увидеть, что полученный результат - массив объектов (stdClass):
array(4) {
[0]=> object(stdClass)#1 (6) { ["id"]=> int(1) ["first_name"]=> string(9) "Bertrando" ["last_name"]=> string(8) "Pedrollo" ["email"]=> string(24) "[email protected]" ["gender"]=> string(4) "Male" ["ip_address"]=> string(12) "62.137.20.86" }
[1]=> object(stdClass)#2 (6) { ["id"]=> int(2) ["first_name"]=> string(4) "Pier" ["last_name"]=> string(9) "Winkworth" ["email"]=> string(19) "[email protected]" ["gender"]=> string(6) "Female" ["ip_address"]=> string(14) "158.139.30.200" }
[2]=> object(stdClass)#3 (6) { ["id"]=> int(3) ["first_name"]=> string(6) "Joyous" ["last_name"]=> string(8) "Glascott" ["email"]=> string(21) "[email protected]" ["gender"]=> string(6) "Female" ["ip_address"]=> string(14) "146.147.52.106" }
[3]=> object(stdClass)#4 (6) { ["id"]=> int(4) ["first_name"]=> string(7) "Daniela" ["last_name"]=> string(5) "Hawes" ["email"]=> string(25) "[email protected]" ["gender"]=> string(6) "Female" ["ip_address"]=> string(15) "148.153.203.134" }
}
Теперь мы можем получить нужные данные из переменной decodedJson, использую синтаксис для работы с объектами:
echo $decodedJson[0]->first_name . " " . $decodedJson[0]->last_name;
echo "
";
echo $decodedJson[1]->first_name . " " . $decodedJson[1]->last_name;
// Результат:
// Bertrando Pedrollo
// Pier Winkworth
Преобразование JSON в ассоциативный массив
Для того, чтобы результатом преобразования JSON-данных с помощью функции jsin_decode
стал ассоциативный массив, а не объект (stdClass), нужно добавить второй параметр $assoc
равный true (по умолчанию его значение - false).
Посмотрим на пример:
$json = '[{ "id": 1, "first_name": "Bertrando", "last_name": "Pedrollo", "email": "[email protected]", "gender": "Male", "ip_address": "62.137.20.86" }, { "id": 2, "first_name": "Pier", "last_name": "Winkworth", "email": "[email protected]", "gender": "Female", "ip_address": "158.139.30.200" }, { "id": 3, "first_name": "Joyous", "last_name": "Glascott", "email": "[email protected]", "gender": "Female", "ip_address": "146.147.52.106" }, { "id": 4, "first_name": "Daniela", "last_name": "Hawes", "email": "[email protected]", "gender": "Female", "ip_address": "148.153.203.134" }]';
$decodedJson = json_decode($json, true);
var_dump($decodedJson);
Результат:
array(4) { [0]=> array(6) { ["id"]=> int(1) ["first_name"]=> string(9) "Bertrando" ["last_name"]=> string(8) "Pedrollo" ["email"]=> string(24) "[email protected]" ["gender"]=> string(4) "Male" ["ip_address"]=> string(12) "62.137.20.86" } [1]=> array(6) { ["id"]=> int(2) ["first_name"]=> string(4) "Pier" ["last_name"]=> string(9) "Winkworth" ["email"]=> string(19) "[email protected]" ["gender"]=> string(6) "Female" ["ip_address"]=> string(14) "158.139.30.200" } [2]=> array(6) { ["id"]=> int(3) ["first_name"]=> string(6) "Joyous" ["last_name"]=> string(8) "Glascott" ["email"]=> string(21) "[email protected]" ["gender"]=> string(6) "Female" ["ip_address"]=> string(14) "146.147.52.106" } [3]=> array(6) { ["id"]=> int(4) ["first_name"]=> string(7) "Daniela" ["last_name"]=> string(5) "Hawes" ["email"]=> string(25) "[email protected]" ["gender"]=> string(6) "Female" ["ip_address"]=> string(15) "148.153.203.134" } }
Теперь, для того чтобы получить необходимые данные, нужно использовать синтаксис для работы с массивами:
echo $decodedJson[0]["first_name"] . " " . $decodedJson[0]["last_name"];
echo "
";
echo $decodedJson[1]["first_name"] . " " . $decodedJson[1]["last_name"];
// Результат:
// Bertrando Pedrollo
// Pier Winkworth
Заключение
Примеры, разбираемые в данной статье, в очередной раз демонстрируют наличие в PHP великолепных нативных функций и замечательной документации. Не поленитесь изучить дополнительную информацию о json_decode на официальном сайте.
Спасибо за внимание.