Ответ 1
Введение
Во-первых, у вас есть строка. JSON не является массивом, объектом или структурой данных. JSON - это текстовый формат сериализации - необычная строка, но все же просто строка. Расшифруйте его в PHP с помощью json_decode()
.
$data = json_decode($json);
Здесь вы можете найти:
- скаляры: строки, целые, плавающие и bools
- null (собственный особый тип)
- составные типы: объекты и массивы.
Это те вещи, которые могут быть закодированы в 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";
}
Застекленный
Шоколад с окроплением
Maple
Или возитесь с любой из встроенных функций массива 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 в ассоциативный PHP-массив вы можете перебирать и ключи, и значения, используя синтаксис foreach (array_expression as $key => $value)
, например
$json = '
{
"foo": "foo value",
"bar": "bar value",
"baz": "baz value"
}';
$assoc = json_decode($json, true);
foreach ($assoc as $key => $value) {
echo "The value of key '$key' is '$value'", PHP_EOL;
}
Печать
Значение ключа 'foo' равно 'foo value'
Значение ключа 'bar' равно 'bar value'
Значение ключа 'baz' равно 'baz value'
Не знаю, как структурированы данные
Прочитайте документацию, чтобы получить 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($yummy->toppings[0]);
stdClass Object
(
[id] => 5002
[type] => Glazed
)
Посмотрите на это в этом удобном интерактивном проводнике JSON.
Разбейте проблему на части, которые легче обернуть вокруг себя.
json_decode()
возвращает null
Это происходит потому, что:
- JSON полностью состоит только из этого,
null
. - JSON недействителен - проверьте результат
json_last_error_msg
или введите что-то вроде JSONLint. - Он содержит элементы, вложенные более 512 уровней. Эту максимальную глубину по умолчанию можно изменить, передав целое число в качестве третьего аргумента
json_decode()
.
Если вам нужно изменить максимальную глубину, вы, вероятно, решаете не ту проблему. Узнайте, почему вы получаете такие глубоко вложенные данные (например, у службы, к которой вы обращаетесь, при создании JSON есть ошибка), и убедитесь, что этого не происходит.
Имя свойства объекта содержит специальный символ
Иногда у вас будет имя свойства объекта, содержащее что-то вроде дефиса -
или знака @
, которое нельзя использовать в литеральном идентификаторе. Вместо этого вы можете использовать строковый литерал в фигурных скобках, чтобы обратиться к нему.
$json = '{"@attributes":{"answer":42}}';
$thing = json_decode($json);
echo $thing->{'@attributes'}->answer; //42
Если у вас есть целое число как свойство, см.: Как получить доступ к свойствам объекта с именами, такими как целые числа? в качестве ссылки.
Кто-то вставил JSON в ваш JSON
Это смешно, но это случается - 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.