Вступ
Спочатку у вас є струна. 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";
}
Глазурований
шоколад з посипанням
клена
Або зіткнутися з будь-якою з базових мільйонів вбудованих функцій масиву .
Доступ до вкладених елементів
Властивості об'єктів та елементів масивів можуть бути більше об'єктів та / або масивів - ви можете просто продовжувати доступ до їх властивостей та членів, як зазвичай, наприклад $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 значення'
Значення ключа 'bar' є 'bar value'
Значення ключа 'baz' є 'baz значення'
Не знаю, як структуровані дані
Прочитайте документацію, що б ви не отримували від 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 закодований як рядок. 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 .