Verification: a143cc29221c9be0

Php array from json file

Пример JSON

{
  "name": "Super hero",
  "town": "Metro City",
  "formed": "2016",
  "location": "Super tower"
}

Чтение файла средствами PHP

Для того чтобы прочитать данные в файле JSON существует функция file_get_content. В самом простом варианте достаточно передать в нее расположение файла JSON и сохранить данные в нужную нам переменную.
Давайте сделаем это и посмотрим что у нас получилось через var_dump:

$ourData = file_get_content("data.json");
var_dump($ourData);

В результате работы вышеописанного кода PHP прочитает данные из файла в переменную $ourData и затем выведет ее содержание:

// Код отформатирован для удобства отображения
string(99) "{ 
"name": "Super hero", 
"town": "Metro City", 
"formed": "2016", 
"location": "Super tower" 
}"

Как видим, данные из файла JSON сохранились в переменную и по сути представляют из себя строку - string

Работать с чистой строкой не особо удобно, поэтому к нам на помощь приходит функция json_decode применить которую можно в нескольких вариантах.

Преобразуем JSON в объект PHP

Вызов функции json_decode в простейшем варианте преобразит строку из файла JSON  в PHP объект (Object)

// получаем данные из JSON файла 
$ourData = file_get_contents("data.json");
// Преобразуем в объект
$object = json_decode($ourData);
var_dump($object); // выводим объект      

В результате мы получим объект PHP:

object(stdClass)#1 (4) {
  ["name"]=>
  string(10) "Super hero"
  ["town"]=>
  string(10) "Metro City"
  ["formed"]=>
  string(4) "2016"
  ["location"]=>
  string(11) "Super tower"
}

И теперь мы можем обратиться к отдельным элементам объекта:

echo $object->name; // Выведет Super hero
echo $object->location; // Выведет Super tower

Преобразуем JSON в массив PHP

Для преобразования в ассоциативный массив воспользуемся функцией json_decode с булевым параметром:

// получаем данные из JSON файла 
$ourData = file_get_contents("data.json");
// Преобразуем в массив
$array = json_decode($ourData, true);
var_dump($array); // выводим массив    

PHP выведет на странице ассоциативный массив:

array(4) { 
["name"]=> string(10) "Super hero" 
["town"]=> string(10) "Metro City" 
["formed"]=> string(4) "2016" 
["location"]=> string(11) "Super tower" 
}

Это позволяет нам теперь обращаться к отдельным данным массива:

echo $array["town"]; // выведет Metro City

Кодирование при помощи функции json_encode

Функция работает только с кодировкой UTF-8.

Рассмотрим простой пример:

$array = [
    'one' => 1,
    'two' => 2,
];

$json = json_encode($array);

echo $json; 

Результат выполнения кода:

{"one":1,"two":2}

Как видим ассоциативный массив превратился в обычную json строку.

Более сложный пример:

$array = [
    'Ключ 1' => 'Значение 1',
    'Ключ 2' => 'Значение 2',
    'Ключ 3' => 'Значение 3',
];

$json = json_encode($array);

echo $json;

Результат выполнения кода:

{"\u041a\u043b\u044e\u0447 1":"\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 1","\u041a\u043b\u044e\u0447 2":"\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 2","\u041a\u043b\u044e\u0447 3":"\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 3"}

Что произошло c кириллицей?

Дело в том, что по умолчанию многобайтовые символы Unicode кодируются как \uXXXX. При раскодировании функцией json_decode они преобразуются в нормальные строки. В некоторых случаях мы можем захотеть избежать этого экранирования, например, чтобы посмотреть как выглядит наш JSON.

Для этого воспользуемся флагом JSON_UNESCAPED_UNICODE:

$json = json_encode($array, JSON_UNESCAPED_UNICODE);

echo $json;

Получаем такой результат:

{"Ключ 1":"Значение 1","Ключ 2":"Значение 2","Ключ 3":"Значение 3"}

Мы может еще в целях изучения кода преобразовать его в более человеческий вид, при помощи дополнительного флага JSON_PRETTY_PRINT

$json = json_encode($array, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);

echo $json;

Получаем такой результат:

{
    "Ключ 1": "Значение 1",
    "Ключ 2": "Значение 2",
    "Ключ 3": "Значение 3"
}

Мы разобрались, как кодировать наши переменные в формат JSON при помощи json_encode.

Более подробная информация об этой функции: https://www.php.net/manual/ru/function.json-encode.php

Другие предопределенные константы с префиксом JSON_ https://www.php.net/manual/ru/json.constants.php

Декодирование c помощью json_decode

Допустим у нас есть строка в формате JSON. Возьмем ее из предыдущего примера:

$json = '{"Ключ 1":"Значение 1","Ключ 2":"Значение 2","Ключ 3":"Значение 3"}';

Давайте раскодируем ее:

$var = json_decode($json);

var_dump($var);

У нас получился результат:

object(stdClass)#117 (3) {
  ["Ключ 1"]=>
  string(18) "Значение 1"
  ["Ключ 2"]=>
  string(18) "Значение 2"
  ["Ключ 3"]=>
  string(18) "Значение 3"
}

Видим, что это тип переменной stdClass. То есть несмотря на то, что мы изначально кодировали в json обычный ассоциативный массив, в результате декодирования у нас получился объект. Подробнее об этом поведении написано здесь: https://phpstack.ru/php/json_decode-kak-perevesti-rezultat-v-massiv.html

Как нам все таки получить обычный массив? Нужно в json_decode передать вторым параметром true:

$var = json_decode($json, true);

var_dump($var);

Получаем результат:

array(3) {
  ["Ключ 1"]=>
  string(18) "Значение 1"
  ["Ключ 2"]=>
  string(18) "Значение 2"
  ["Ключ 3"]=>
  string(18) "Значение 3"
}

Теперь мы получили обычный массив. Таким образом разобрались как работать с функцией json_decode для декодирования строки формата JSON.

Более подробная информация об этой функции: https://www.php.net/manual/ru/function.json-decode.php

Обработка ошибок

В случае ошибки, эти функции просто молча возвращают null.

Мы можем проверить, что нам вернулось null и посмотреть какая произошла ошибка следующим образом:

$json = '{{{ некорректный JSON!';

$var = json_decode($json, true);

if($var === null) {
    echo json_last_error_msg(); // эта строка выведет: Syntax error
}

Иногда нам может быть полезно не молчаливо возвращать null, а выкинуть Exception и обработать его. PHP >7.3 предоставляет нам такую возможность.

Это можно сделать при помощи флага JSON_THROW_ON_ERROR

Рассмотрим пример:

$json = '{{{ некорректный JSON!';

$var = json_decode($json, true, JSON_THROW_ON_ERROR);

Теперь результат этого кода JsonException с сообщением Syntax error

Более подробно про обработку ошибок JSON:

https://www.php.net/manual/ru/function.json-last-error-msg.php

https://www.php.net/manual/ru/function.json-last-error.php

Как вывести JSON ответ на ajax запрос

Когда к нашему PHP скрипту обращается например javascript с ajax запросом, для того, чтобы подгрузить на страницу новые данные, то часто возникает необходимость ответить в формате JSON.

Для того, чтобы это сделать, нужно отправить заголовок Content-type:application/json;charset=utf-8 и просто вывести строку с закодированными данными.

Содержимое файла text_json.php

$array = ['data' => 'ваши данные'];
$jsonString = json_encode($array); // переводим данные в JSON строку

// отправляем заголовок, который позволит клиенту определить, 
// что возвращается ответ в формате JSON
header('Content-type:application/json;charset=utf-8'); 

echo $jsonString; // выводим JSON строку

exit(); // прекращаем выполнение скрипта

Тем временем в javascript мы можем обратиться к нашему php скрипту таким образом:

$('.js-button').on('click', function(){
    $.ajax({
        url: '/text_json.php',
        type: 'get',
        success: function(response) {
            // выводим alert со строкой "ваши данные", 
            // которую мы только что получили из php
            alert(response.data); 
        }
    });
});