Как извлечь данные из JSON с помощью PHP?
Это общий справочный вопрос и ответ, охватывающий многие из нескончаемых «Как мне получить доступ к данным в моем 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 в ассоциативный массив 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, содержит ошибку), и этого не должно происходить.
Имя свойства объекта содержит специальный символ
Иногда у вас будет имя свойства объекта, которое содержит что-то вроде дефиса -или знака «at», @которые нельзя использовать в буквальном идентификаторе. Вместо этого вы можете использовать строковый литерал в фигурных скобках для его адресации.
$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 .
Вы можете использовать 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иначе она вернется- NULL.
- В случае сбоя декодирования json_last_error()может использоваться для определения точного характера ошибки.
- Убедитесь, что вы передаете utf8контент, иначеjson_decodeможет произойти ошибка и просто вернутьNULLзначение.
// Using json as php array 
$json = '[{"user_id":"1","user_name":"Sayeed Amin","time":"2019-11-06 13:21:26"}]';
//or use from file
//$json = file_get_contents('results.json');
$someArray = json_decode($json, true);
foreach ($someArray as $key => $value) {
    echo $value["user_id"] . ", " . $value["user_name"] . ", " . $value["time"] . "<br>";
}
Мы можем декодировать строку json в массив с помощью функции json_decode в php
1) json_decode ($ json_string) // возвращает объект
2) json_decode ($ json_string, true) // возвращает массив
$json_string = '{
    "type": "donut",
    "name": "Cake",
    "toppings": [
        { "id": "5002", "type": "Glazed" },
        { "id": "5006", "type": "Chocolate with Sprinkles" },
        { "id": "5004", "type": "Maple" }
    ]
}';
$array = json_decode($json_string,true);
echo $array['type']; //it gives donut
Рассмотрите возможность использования JSONPath https://packagist.org/packages/flow/jsonpath
Существует довольно четкое объяснение того, как его использовать и анализировать JSON-файл, избегая всех предложенных циклов . Если вы знакомы с XPathдля XMLвы начнете любить этот подход.