У меня есть JSON:
{
"type": "donut",
"name": "Cake",
"toppings": [
{ "id": "5002", "type": "Glazed" },
{ "id": "5006", "type": "Chocolate with Sprinkles" },
{ "id": "5004", "type": "Maple" }
]
}
Как мне декодировать его в PHP и получить доступ к полученным данным?
Ответ 1
Вступление
Во-первых, JSON - это не массив, объект или структура данных. JSON - это текстовый формат для сериализации, проще говоря, просто строка. Декодирование его в PHP осуществляется с помощью функции json_decode().
$data = json_decode($json);
JSON состоит из следующих элементов:
Скаляры – строки, целые и вещественные числа, логические значения;
null – особый внутренний тип;
Составные типы – объекты и массивы.
Доступ к свойствам объектов
Получение доступа к свойствам одного из этих объектов такое же, как и к публичным нестатическим свойствам любого другого объекта, например, $object->property.
$json = '{
"type": "donut",
"name": "Cake"
}';
$yummy = json_decode($json);
echo $yummy->type;
Доступ к элементам массива
Получение доступа к элементам одного из этих массивов такое же, как и к любому другому массиву, например, $array[0].
$json = '[
"Glazed",
"Chocolate with Sprinkles",
"Maple"
]';
$toppings = json_decode($json);
echo $toppings[1];
Итерация с помощью 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;
Передача 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'];
Доступ к элементам ассоциативного массива
При декодировании объекта 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 "Значение ключа '$key' равно '$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
)
)
)
Этот объект описывает структуру, которая показывает, где у вас объекты, где массивы, а также имена и значения их членов.
Если json_decode() возвращает null
Это может произойти по следующим причинам:
JSON полностью состоит только из этого null.
JSON поврежден – проверьте его, используя json_last_error_msg,или проанализируйте, используя что-то вроде JSONLint.
JSON содержит элементы, вложенные более чем на 512 уровней. Эту максимальную глубину по умолчанию можно изменить, передав целое число в качестве третьего аргумента json_decode().
Если вам приходится менять максимальную глубину, у вас, вероятно, поврежденные данные. Выясните, почему вы получаете такие глубоко вложенные данные (например, запрашиваемая вами служба, генерирующая JSON, содержит ошибку), и этого не должно происходить.
Имя свойства объекта содержит специальный символ
Иногда имя свойства объекта содержит что-то вроде дефиса или знака @, которые нельзя использовать в идентификаторе. В этом случае надо использовать строковый литерал в фигурных скобках для его адресации.
$json = '{"@attributes":{"answer":42}}';
$thing = json_decode($json);
echo $thing->{'@attributes'}->answer;
Иногда встречаются случаи, когда в 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;
Ответ 2
Можно использовать 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 требует, чтобы строка была действительной, иначе функция вернется NULL.
В случае сбоя декодирования функция json_last_error() может использоваться для описания ошибки.
Убедитесь, что вы передаете контент в кодировке utf8, иначе в json_decode может произойти ошибка и результат будет NULL.
Web