Вопрос:

Как извлечь данные из JSON с помощью PHP?

php json

230408 просмотра

4 ответа

18466 Репутация автора

Предполагается, что это общий справочный вопрос и ответ, охватывающий многие бесконечные вопросы «Как получить доступ к данным в моем JSON?» вопросы. Это здесь, чтобы справиться с широкими основами декодирования JSON в PHP и доступа к результатам.

У меня есть JSON:

{
    "type": "donut",
    "name": "Cake",
    "toppings": [
        { "id": "5002", "type": "Glazed" },
        { "id": "5006", "type": "Chocolate with Sprinkles" },
        { "id": "5004", "type": "Maple" }
    ]
}

Как мне декодировать это в PHP и получить доступ к полученным данным?

Автор: user3942918 Источник Размещён: 27.03.2015 07:38

Ответы (4)


366 плюса

18466 Репутация автора

Решение

вступление

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

Посмотрите на 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 есть кодировка в виде строки. 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 .

Автор: user3942918 Размещён: 27.03.2015 07:38

12 плюса

7125 Репутация автора

Вы можете использовать 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значение.
Автор: Mohd Abdul Mujib Размещён: 26.10.2016 01:24

-3 плюса

997 Репутация автора

Я написал пакет с именем 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 , который я тоже написал.

Автор: MAChitgarha Размещён: 25.01.2019 08:39

-3 плюса

670 Репутация автора

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) );

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

Автор: harish sharma Размещён: 12.03.2019 12:27
Вопросы из категории :
32x32