Как извлечь данные из 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 и получить доступ к результирующим данным?

Ответы

Ответ 1

Введение

Во-первых, у вас есть строка. 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";
}

Застекленный
Шоколад с окроплением
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

Это происходит потому, что:

  1. JSON полностью состоит только из этого, null.
  2. JSON недействителен - проверьте результат json_last_error_msg или введите что-то вроде JSONLint.
  3. Он содержит элементы, вложенные более 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.

Ответ 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 требует, чтобы строка была действительным json else, она вернет NULL.
  • В случае отказа декодирования json_last_error() может использоваться для определения точного характера ошибки.
  • Убедитесь, что вы передаете содержимое utf8, или json_decode может выйти из строя и просто вернуть значение NULL.

Ответ 3

Функция PHP json_decode принимает строку JSON и преобразует ее в переменную PHP. Как правило, данные JSON будут представлять массив JavaScript или литерал объекта, который json_decode преобразует в массив или объект PHP. Следующие два примера демонстрируют:

$json = '["apple","orange","banana","strawberry"]';
$ar = json_decode($json);
// access first element of $ar array
echo $ar[0]; // apple

Ответ 4

Вы можете использовать пакет JSON (GitHub, Packagist). Вы можете легко установить его с помощью Composer.

пример

use MAChitgarha\Component\JSON;

$jsonStr = <<<JSON
{
    "type": "donut",
    "name": "Cake",
    "toppings": [
        { "id": "5002", "type": "Glazed" },
        { "id": "5006", "type": "Chocolate with Sprinkles" },
        { "id": "5004", "type": "Maple" }
    ]
}
JSON;

// Create an instance
$json = new JSON($jsonStr);

// Get a nested element using dots
$json->get("toppings.1.type"); // Chocolate with Sprinkles
$json["toppings.1.type"]; // Chocolate with Sprinkles

// Iterate over an element
foreach ($json->iterate("toppings") as $item)
    echo "{$item->id}: {$item->type}", PHP_EOL;

// Change an element
$json->set("toppings.3", [
    "id" => "5000",
    "type" => "Unknown"
]);

// Get data as JSON string, array or object, respectively
$json->getDataAsJson();
$json->getDataAsArray();
$json->getDataAsObject();

Посмотрите вики или краткое руководство, чтобы ознакомиться с ним.

Кроме того, если вы хотите прочитать файлы JSON и извлечь их данные (как вы, кажется, пытаетесь это сделать), см. Пакет JSONFile.

Ответ 5

PHP JSON

<?php
$data=file_get_contents("file.json");
$result=json_decode($data);
print_r($result);

JPOPHP (JSON Parser Object PHP)

Это не официальная функция.

Вторичная библиотека, которая предлагает интересные функции, такие как json_decode, json_encode:

JPOPHP (JSON Parser Object PHP) - это библиотека для анализа данных в формате JSON.

https://github.com/BaseMax/JPOPHP

https://www.phpclasses.org/package/11110-PHP-Encode-and-decode-data-in-JSON-format.html

Ответ 6

Мы можем декодировать строку 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

Ответ 7

Я написал пакет с именем JSON (GitHub, Packagist). Если вы хотите избежать накладных расходов на использование функций json_*, попробуйте это.

пример

use MAChitgarha\Component\JSON;

$jsonStr = <<<JSON
{
    "type": "donut",
    "name": "Cake",
    "toppings": [
        { "id": "5002", "type": "Glazed" },
        { "id": "5006", "type": "Chocolate with Sprinkles" },
        { "id": "5004", "type": "Maple" }
    ]
}
JSON;

// Create an instance
$json = new JSON($jsonStr);

// Get a nested element using dots
$json->get("toppings.1.type"); // Chocolate with Sprinkles
$json["toppings.1.type"]; // Chocolate with Sprinkles

// Iterate over an element
foreach ($json->iterate("toppings") as $item)
    echo "{$item->id}: {$item->type}", PHP_EOL;

// Change an element
$json->set("toppings.3", [
    "id" => "5000",
    "type" => "Unknown"
]);

// Get data as JSON string, array or object, respectively
$json->getDataAsJson();
$json->getDataAsArray();
$json->getDataAsObject();

Посмотрите вики или краткое руководство, чтобы ознакомиться с ним.

Более того, если вы хотите прочитать файлы JSON и извлечь их данные (как вы, кажется, пытаетесь это сделать), посмотрите пакет JSONFile, который я тоже написал.

Ответ 8

https://paiza.io/projects/X1QjjBkA8mDo6oVh-J_63w

Проверьте приведенный ниже код для преобразования json в массив в PHP Если JSON верен, то json_decode() работает хорошо и вернет массив, но если JSON искажен, то он вернет NULL,

<?php
function jsonDecode1($json){
    $arr = json_decode($json, true);
    return $arr;
}

// In case of malformed JSON, it will return NULL
var_dump( jsonDecode1($json) );

Если JSON искажен, и вы ожидаете только массив, вы можете использовать эту функцию,

<?php
function jsonDecode2($json){
    $arr = (array) json_decode($json, true);
    return $arr;
}

// In case of malformed JSON, it will return an empty array()
var_dump( jsonDecode2($json) );

Если JSON искажен, и вы хотите остановить выполнение кода, то вы можете использовать эту функцию,

<?php
function jsonDecode3($json){
    $arr = (array) json_decode($json, true);

    if(empty(json_last_error())){
        return $arr;
    }
    else{
        throw new ErrorException( json_last_error_msg() );
    }
}

// In case of malformed JSON, Fatal error will be generated
var_dump( jsonDecode3($json) );

Вы можете использовать любую функцию в зависимости от ваших требований,