Як отримати дані з JSON за допомогою PHP?


214

Це має бути загальним довідковим запитанням та відповіддю, що охоплює багато нескінченних "Як я отримую доступ до даних у своєму 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
Пов’язано: Можливість бачити змінну у виводі print_r (), але не впевнений, як отримати доступ до неї в коді , тут можливе інтерактивне дослідження JSON в контексті PHP: array.include-once.org
hakre

Будь ласка, чи можу я знати, чому це питання не вважається дублюючим запитанням навіть 9 або менше користувачів, позначених як дублікат для stackoverflow.com/questions/4343596/parsing-json-file-with-php ? М
Я найдурніша людина

@IamtheMostStupidPerson Я спробую пояснити, хоча ваше ім'я користувача сумнівається, що ви його отримаєте;). Це запитання задається, а його відповіді пишуться "канонічно". Таким чином, він кращий одержувач для дублювання цілі, ніж інші питання.
Фелікс Ганьон-Греньє,

Відповіді:


428

Вступ

Спочатку у вас є струна. 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

Це відбувається тому, що:

  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 закодований як рядок. 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 .


просто натрапив на цю відповідь і виявив, що посилання на array.include-once.org порушено.
Джефф

@Jeff Дякую Ганьба з цього приводу. Я видалив посилання.
користувач3942918

так, враховуючи назву посилання та те, як ви її описали, це звучить як справжній облом.
Джефф

єдине, чого цього рішення не вистачає, - це витяг даних з іншого файлу json. Я б рекомендував, це solutuon: stackoverflow.com/questions/19758954 / ...
Ishan Срівастава

Це чудово. Дякую.
Девід

17

Ви можете використовувати 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значення.

ну, можливо, їм не сподобалася її простота. Ви завжди можете подати заяву;)
Мохд Абдул Муджіб

1
Можливо, більш вірогідною причиною є те, що на нього вже відповіли, і схоже, що @MohdAbdulMujib після декількох безкоштовних представників
Ісаак

3
@Isaac деякі люди можуть не дуже прагнути прочитати весь посібник, коли вони просто хочуть почати з використання функції. Інакше їм краще прочитати офіційний документ. Вся суть SO - простота, в якій надаються відповіді. ІМХО
Мохд Абдул Муджіб

3
// 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>";
}

1

Ми можемо розшифрувати рядок 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

0

Подумайте про використання JSONPath https://packagist.org/packages/flow/jsonpath

Існує досить чітке пояснення, як ним користуватися та розбирати JSON-файл, уникаючи всіх запропонованих циклів . Якщо ви знайомі з XPathдля XMLви почнете любити цей підхід.


-1

Я написав пакет з іменем 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 , який я і написав.


-2

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

Ви можете використовувати будь-яку функцію, залежно від вашої потреби,

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.