Это предназначено для общего справочного вопроса и ответа, охватывающего многие из бесконечных «Как мне получить доступ к данным в моем JSON?» вопросов. Здесь мы рассмотрим широкие основы декодирования JSON в PHP и доступа к результатам.
У меня есть JSON:
{ "type": "donut", "name": "Cake", "toppings": [ { "id": "5002", "type": "Glazed" }, { "id": "5006", "type": "Chocolate with Sprinkles" }, { "id": "5004", "type": "Maple" } ] }
Как я могу декодировать это в PHP и получить доступ к результирующим данным?
Сначала у вас есть строка. JSON не является массивом, объектом или структурой данных. JSON представляет собой текстовый формат сериализации – так что это причудливая строка, но все же просто строка. Расшифруйте его на PHP с помощью json_decode()
.
$data = json_decode($json);
Там вы можете найти:
Это те вещи, которые могут быть закодированы в JSON. Или, точнее, это версии PHP, которые могут быть закодированы в JSON.
В них нет ничего особенного. Они не являются объектами JSON или массивами JSON. Вы расшифровали JSON – теперь у вас есть обычные повседневные типы PHP .
Объектами будут экземпляры stdClass , встроенного класса, который является просто общим, что здесь не важно.
Вы получаете доступ к свойствам одного из этих объектов так же, как и для публичных нестатических свойств любого другого объекта, например $object->property
.
$json = ' { "type": "donut", "name": "Cake" }'; $yummy = json_decode($json); echo $yummy->type; //donut
Вы получаете доступ к элементам одного из этих массивов так же, как и для любого другого массива, например $array[0]
.
$json = ' [ "Glazed", "Chocolate with Sprinkles", "Maple" ]'; $toppings = json_decode($json); echo $toppings[1]; //Chocolate with Sprinkles
Итерации над ним с помощью foreach
.
foreach ($toppings as $topping) { echo $topping, "\n"; }
глазированный
Шоколад с посыпками
кленовый
Или беспорядок с любой из встроенных функций массива bazillion .
Свойства объектов и элементов массивов могут быть больше объектов и / или массивов – вы можете просто продолжать доступ к своим свойствам и членам, как обычно, например $object->array[0]->etc
. Д.
$json = ' { "type": "donut", "name": "Cake", "toppings": [ { "id": "5002", "type": "Glazed" }, { "id": "5006", "type": "Chocolate with Sprinkles" }, { "id": "5004", "type": "Maple" } ] }'; $yummy = json_decode($json); echo $yummy->toppings[2]->id; //5004
true
в качестве второго аргумента json_decode () Когда вы это сделаете, вместо объектов вы получите ассоциативные массивы – массивы со строками для ключей. Снова вы обращаетесь к их элементам, как обычно, например $array['key']
.
$json = ' { "type": "donut", "name": "Cake", "toppings": [ { "id": "5002", "type": "Glazed" }, { "id": "5006", "type": "Chocolate with Sprinkles" }, { "id": "5004", "type": "Maple" } ] }'; $yummy = json_decode($json, true); echo $yummy['toppings'][2]['type']; //Maple
Прочитайте документацию, из-за которой вы получаете JSON.
Посмотрите на JSON – где вы видите фигурные скобки {}
ожидайте объект, где вы видите квадратные скобки []
ожидающие массив.
Удалите декодированные данные с помощью print_r()
:
$json = ' { "type": "donut", "name": "Cake", "toppings": [ { "id": "5002", "type": "Glazed" }, { "id": "5006", "type": "Chocolate with Sprinkles" }, { "id": "5004", "type": "Maple" } ] }'; $yummy = json_decode($json); print_r($yummy);
и проверьте вывод:
stdClass Object ( [type] => donut [name] => Cake [toppings] => Array ( [0] => stdClass Object ( [id] => 5002 [type] => Glazed ) [1] => stdClass Object ( [id] => 5006 [type] => Chocolate with Sprinkles ) [2] => stdClass Object ( [id] => 5004 [type] => Maple ) ) )
Он расскажет вам, где у вас есть объекты, где у вас есть массивы, а также имена и значения их членов.
Если вы можете зайти так далеко до того, как потеряетесь, зайдите так далеко и print_r()
с помощью print_r()
:
print_r($yummy->toppings[0]);
stdClass Object ( [id] => 5002 [type] => Glazed )
Разбейте проблему на части, которые легче обернуть вокруг головы.
json_decode()
возвращает null
Это происходит потому, что либо:
null
. json_last_error_msg
или json_last_error_msg
его через нечто вроде JSONLint . json_decode()
. Если вам нужно изменить максимальную глубину, вы, вероятно, решаете неправильную проблему. Узнайте, почему вы получаете такие глубоко вложенные данные (например, у службы, к которой вы обращаетесь, что генерирует JSON, есть ошибка), и получите это, чтобы этого не произошло.
Иногда у вас будет имя свойства объекта, которое содержит нечто вроде дефиса или знака @
которое не может использоваться в литеральном идентификаторе. Вместо этого вы можете использовать строковый литерал в фигурных скобках для его адресации.
$json = '{"@attributes":{"answer":42}}'; $thing = json_decode($json); echo $thing->{'@attributes'}->answer; //42
Если у вас есть свойство integer as, см.: Как получить доступ к свойствам объекта с именами, такими как целые числа? в качестве ссылки.
Это смешно, но это происходит – JSON закодирован как строка в вашем JSON. Декодируйте, как обычно, получите доступ к строке, расшифруйте ее и, в конечном итоге, получите то, что вам нужно.
$json = ' { "type": "donut", "name": "Cake", "toppings": "[{ \"type\": \"Glazed\" }, { \"type\": \"Maple\" }]" }'; $yummy = json_decode($json); $toppings = json_decode($yummy->toppings); echo $toppings[0]->type; //Glazed
Если ваш JSON слишком велик для json_decode()
чтобы обращаться сразу, все начинает становиться сложным. Видеть:
См .: Ссылка: все основные способы сортировки массивов и данных в PHP .
Вы можете использовать json_decode () для преобразования строки json в объект / массив PHP.
Например.
Входные данные :
$json = '{"a":1,"b":2,"c":3,"d":4,"e":5}'; var_dump(json_decode($json)); var_dump(json_decode($json, true));
Вывод:
object(stdClass)#1 (5) { ["a"] => int(1) ["b"] => int(2) ["c"] => int(3) ["d"] => int(4) ["e"] => int(5) } array(5) { ["a"] => int(1) ["b"] => int(2) ["c"] => int(3) ["d"] => int(4) ["e"] => int(5) }
Несколько пунктов для запоминания:
json_decode
требует, чтобы строка была действительным json
else, она вернет NULL
. json_last_error()
может использоваться для определения точного характера ошибки. utf8
, или json_decode
может выйти из строя и просто вернуть значение NULL
.