вступление
Во-первых, у вас есть строка. 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 в ассоциативный массив 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 есть кодировка в виде строки. Decode, доступ строка как обычно, расшифровывает , что , и в конечном итоге получить то, что вам нужно.
$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 .