Php читает json из файла

Обновлено: 01.07.2024

Принимает строку в формате JSON и преобразует ее в переменную PHP.

Параметры

Декодируемая строка json.

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

Если задано значение true , объекты JSON будут возвращены в виде ассоциативного массива s; когда false , объекты JSON будут возвращены как object s. Когда null , объекты JSON будут возвращены как ассоциативный массив s или объект s в зависимости от того, установлен ли JSON_OBJECT_AS_ARRAY во флагах .

Максимальная глубина вложенности декодируемой структуры.

Битовая маска JSON_BIGINT_AS_STRING, JSON_INVALID_UTF8_IGNORE, JSON_INVALID_UTF8_SUBSTITUTE, JSON_OBJECT_AS_ARRAY, JSON_THROW_ON_ERROR. Поведение этих констант описано на странице констант JSON.

Возвращаемые значения

Возвращает значение, закодированное в json, в соответствующем типе PHP. Значения true , false и null возвращаются как true , false и null соответственно. null возвращается, если json не может быть декодирован или если закодированные данные глубже, чем предел вложенности.

Журнал изменений

< td> Добавлены флаги JSON_THROW_ON_ERROR.
Версия Описание
7.3.0
7.2.0 ассоциативный ряд теперь обнуляется.
7.2.0 JSON_INVALID_UTF8_IGNORE и JSON_INVALID_UTF8_SUBSTITUTE были добавлены флаги.
7.1.0 Пустой ключ JSON ("") можно закодировать в свойство пустого объекта вместо использования ключа со значением _empty_ .

Примеры

var_dump ( json_decode ( $json ));
var_dump (json_decode ($json, true));

Приведенный выше пример выведет:

Доступ к элементам внутри объекта, которые содержат символы, не разрешенные соглашением об именах PHP (например, дефис), можно осуществить, заключив имя элемента в фигурные скобки и апостроф.

$obj = json_decode ( $json );
print $obj -> 'foo-bar' >; // 12345

// следующие строки допустимы для JavaScript, но недопустимы для JSON

// имя и значение должны быть заключены в двойные кавычки
// одинарные кавычки недопустимы
$bad_json = "< 'bar': 'baz' >" ;
json_decode ( $bad_json ); // ноль

// имя должно быть заключено в двойные кавычки
$bad_json = '< bar: "baz" >' ;
json_decode ( $bad_json ); // ноль

// запятые в конце не допускаются
$bad_json = '< bar: "baz", >' ;
json_decode ( $bad_json ); // ноль

// Кодируем некоторые данные с максимальной глубиной 4 (массив -> массив -> массив -> строка)
$json = json_encode (
array(
1 => array(
'Английский' => массив(
'Один' ,
'Январь',
),
'Французский' => массив(
'Один' ,
'Жанвье'
)
)
)
);

// Показать ошибки для разных глубин.
var_dump (json_decode ($json, true, 4));
echo 'Последняя ошибка:', json_last_error_msg (), PHP_EOL, PHP_EOL;

var_dump (json_decode ($json, true, 3));
echo 'Последняя ошибка:', json_last_error_msg (), PHP_EOL, PHP_EOL;
?>

Приведенный выше пример выведет:

var_dump ( json_decode ( $json ));
var_dump (json_decode ($json, false, 512, JSON_BIGINT_AS_STRING));

Приведенный выше пример выведет:

Примечания

Примечание.

Спецификация JSON — это не JavaScript, а подмножество JavaScript.

Примечание.

В случае сбоя декодирования можно использовать json_last_error() для определения точного характера ошибки.

См. также

  • json_encode() – возвращает значение в формате JSON.
  • json_last_error() — возвращает последнюю возникшую ошибку

Пользовательские заметки 7 заметок

JSON можно декодировать в массивы PHP, используя параметр $associative = true. Имейте в виду, что ассоциативные массивы в PHP могут быть "списком" или "объектом" при преобразовании в/из JSON, в зависимости от ключей (или их отсутствия).

Вы ожидаете, что перекодирование и перекодирование всегда будут давать одну и ту же строку JSON, но возьмем следующий пример:

$json = '';
$array = json_decode($json, true); // декодировать как ассоциативный хэш
print json_encode($array) . PHP_EOL;

Это приведет к выводу строки JSON, отличной от исходной:

Объект превратился в массив!

Аналогично массив, который не имеет последовательных нулевых числовых индексов, будет закодирован в объект JSON вместо списка.

$array = [
'первый',
'второй',
'третий',
];
распечатать json_encode($array) . PHP_EOL;
// удаляем второй элемент
unset($array[1]);
распечатать json_encode($array) . PHP_EOL;

Вывод будет таким:

Массив превратился в объект!

Другими словами, декодирование/кодирование в/из массивов PHP не всегда симметрично или может не всегда возвращать то, что вы ожидаете!

С другой стороны, декодирование/кодирование из/в объекты stdClass (по умолчанию) всегда симметрично.

С массивами может быть несколько проще работать/преобразовывать, чем с объектами. Но особенно если вам нужно декодировать и перекодировать json, может быть целесообразно декодировать объекты, а не массивы.

Если вы хотите принудительно закодировать массив в список JSON (все ключи массива будут отброшены), используйте:

JSON (сокращение от JavaScript Object Notation) – это распространенный облегченный формат для хранения и обмена информацией. Как следует из названия, изначально он был получен из JavaScript, но это независимый от языка формат для хранения информации. Многие языки, такие как PHP, теперь реализуют функции для чтения и создания данных JSON.

Это руководство научит вас читать файл JSON и преобразовывать его в массив в PHP. Узнайте, как анализировать JSON с помощью функций json_decode() и json_encode().

Чтение JSON из файла или строки в PHP

Допустим, у вас есть файл, содержащий информацию в формате JSON. Как получить к нему доступ и сохранить его в PHP?

Во-первых, вам нужно получить данные из файла в переменную с помощью file_get_contents() . Как только данные находятся в строке, вы можете вызвать функцию json_decode() для извлечения информации из строки. Имейте в виду, что JSON просто предоставляет способ хранения информации в виде строки с использованием набора предопределенных правил. Наша задача — правильно декодировать строки и получить нужную информацию.

Функция json_decode() принимает четыре параметра, но в большинстве случаев вам понадобятся только первые два. Первый параметр указывает строку, которую вы хотите декодировать. Второй параметр определяет, как возвращаются декодированные данные. Установка его в значение true вернет ассоциативный массив, а значение false вернет объекты. Вот простой пример. У нас есть файл с именем people.json со следующим содержимым:

Мы можем прочитать информацию из этого файла JSON, используя приведенный ниже код:

В приведенном выше примере функция json_decode() вернула объект, поскольку для второго параметра было задано значение false . Вы можете установить значение true, чтобы вернуть данные в виде ассоциативного массива.

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

Наша цель — вернуть все страны, которые посетил человек в разные годы. Значение, возвращаемое $decoded_json['countries'], на самом деле будет массивом, и мы будем перебирать его, как обычные массивы, чтобы получить наши данные.

Давайте рассмотрим последний пример извлечения информации из файла JSON. Вот JSON, из которого мы будем извлекать наши данные.

На этот раз у нас есть два вложенных массива данных JSON. Поэтому мы будем использовать два вложенных цикла, чтобы получить страны, которые посещают разные клиенты.

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

Чтение данных JSON без предварительного знания ключей

До сих пор мы читали данные JSON, где уже знали все ключи. Это не всегда может быть правдой. К счастью, мы все еще можем извлечь полезную информацию из файла, сохранив его в виде ассоциативного массива. Следующий пример должен прояснить ситуацию.

Ключи в приведенном выше JSON кажутся случайными строками, которые мы не можем предсказать заранее. Однако, как только мы преобразуем его в ассоциативный массив, нам больше не нужно будет знать точные значения ключей для перебора данных.

Создание данных JSON в PHP

Вы также можете преобразовать свои собственные данные в правильно отформатированную строку JSON в PHP с помощью функции json_encode(). В основном он принимает три параметра, но обычно вам нужен только первый, то есть значение, которое вы хотите закодировать в большинстве ситуаций.

Вам также может понадобиться использовать некоторые флаги, чтобы получить строку JSON в нужном формате. Например, вы можете использовать флаг JSON_PRETTY_PRINT, чтобы добавить пробел для правильного форматирования строки JSON. Точно так же вы можете использовать флаг JSON_PRESERVE_ZERO_FRACTION, чтобы убедиться, что значения с плавающей запятой всегда хранятся как числа с плавающей запятой, даже если они эквивалентны какому-то целому по величине. Вы можете увидеть список всех таких флагов в официальной документации.

Работа с ошибками во время кодирования и декодирования

Формат JSON требует от нас соблюдения определенного набора правил для правильного кодирования и декодирования строк. Например, имена и значения должны быть заключены в двойные кавычки, а после пар имя-значение не должно быть завершающей запятой. Функция json_last_error_msg() может помочь вам выяснить, какую ошибку вы получаете, чтобы предпринять соответствующие шаги. Вот очень простой пример:

Заключительные мысли

В этом руководстве вы узнали, как читать данные JSON из файла или строки в PHP. Вы также узнали, как преобразовать этот JSON в массив и пройти по нему, чтобы извлечь нужную информацию.Теперь вы сможете получить информацию из JSON в файле, где вы не знаете все ключи в парах "ключ-значение".

В последних двух разделах мы рассмотрели, как преобразовать данные в строку JSON в PHP, а также ошибки, которые могут возникнуть в процессе кодирования и декодирования.

Надеюсь, это ответит на все ваши вопросы о кодировании и декодировании JSON в PHP.

Я попытался разобрать файл JSON с помощью PHP. Но сейчас я застрял.

Это содержимое моего файла JSON:

И это то, что я пробовал до сих пор:

Но поскольку я заранее не знаю имен (например, "Джон", "Дженнифер") и всех доступных ключей и значений (например, "возраст", "количество"), я думаю, что мне нужно создать цикл foreach.

Я был бы признателен за пример для этого.



Вы на правильном пути. Посмотрите синтаксис foreach (вы должны получить ключи и значения). Не сдавайтесь!

@JamWaffles Ха-ха, спасибо. Я надеялся, что OP сможет получить некоторый опыт в поиске этого. Голосуйте за, потому что это действительно все, что ему нужно.

Примечание: я предлагаю настроить PHP таким образом, чтобы отображались все виды сообщений об ошибках, включая уведомления

Можете ли вы уточнить, что вы пытаетесь получить от «анализа» JSON: то есть какую задачу вы пытаетесь выполнить с помощью своего кода (например: «вывести все статусы», «найти имена, где статус равен xyz» , "найти всю информацию для xyz")?

16 ответов 16

Для перебора многомерного массива можно использовать RecursiveArrayIterator


@Альваро, очевидно. С foreach вы можете рекурсировать только на один уровень глубины. С помощью описанного выше подхода вы можете рекурсивно работать с многоуровневым массивом. Кроме того, все это заключено в ООП, поэтому у вас есть лучшее повторное использование, и вы можете легко смоделировать его в UnitTests, плюс вы можете складывать итераторы с другими итераторами, выполняющими разные действия, такие как ограничение, кэширование, фильтрация и т. д. в дополнение к любому пользовательские итераторы, которые вы, возможно, захотите создать.

хорошо, я не подумал, что уровень вложенности может быть переменным. В таком случае это чище, чем рекурсивная функция.

Не могу поверить, что так много людей публикуют ответы, не прочитав должным образом JSON.

Если вы foreach итерируете только $json_a, у вас есть объект объектов. Даже если вы передадите true в качестве второго параметра, у вас будет двумерный массив. Если вы просматриваете первое измерение, вы не можете просто повторить второе измерение. Так что это неправильно:

Чтобы отобразить статусы каждого человека, попробуйте следующее:

Если файлы php и json находятся в одном каталоге, мы можем прочитать json с помощью file_get_contents("test.json"); (Не нужно указывать путь).

@Chetabahana На самом деле это неправильно. Если вы используете относительный путь, такой как test.json , тогда путь оценивается относительно текущего каталога, а не обязательно там, где находится PHP-скрипт. В bash вы можете узнать текущий каталог, набрав pwd .

@Flimm Если PHP и JSON и выполнение происходят в одном и том же каталоге, нет необходимости указывать абсолютный путь к файлу JSON. Верно?

@Nguaial Это зависит от текущего рабочего каталога. Например, допустим, у вас есть файл PHP /home/user/project/test.php и файл JSON /home/user/project/json.json . Если ваша текущая работа — это /home/user , то для запуска файла PHP вы должны ввести php project/test.php . В этом случае файл PHP должен будет ссылаться на файл JSON как project/test.json, поскольку относительные пути относятся к текущему рабочему каталогу, а не обязательно к родительскому каталогу файла PHP.

Самое элегантное решение:

Помните, что json-файл должен быть закодирован в UTF-8 без BOM. Если у файла есть спецификация, то json_decode вернет NULL.


Очень круто, но вся эта ведомость материалов (BOM) совершенно меня сбивает с толку. э. О чем ты говоришь? Меня одного раздражает использование загадочных необъяснимых сокращений? Можно использовать аббревиатуры, но, пожалуйста, объясните, когда впервые используется (WFU). спасибо.


Ответы

Попробуйте это не имеют большого значения для StackOverflow, потому что они мало что дают для обучения ОП и будущих исследователей. Если вы собираетесь оставить этот ответ на странице, объясните, как работает ваш ответ и почему это целесообразно.

Я совершенно не понимаю, что никто не указал, что ваши начальные "теги" неверны. Вы создаете объект с помощью <>, а массив можно создать с помощью [].

С этим изменением json будет анализироваться как массив, а не как объект. И с этим массивом вы можете делать все, что хотите, например циклы и т. д.

О мой.Я должен добавить, что вы, похоже, удалили ключ в json OP при преобразовании в массив. Так что ОП прав.

"Но потому, что я не знаю имен (например, Джон, Дженнифер) и всех доступных ключей". Кажется, он не знает ключей, поэтому единственный способ обойти коллекцию — зациклиться. Этот вид говорит мне, что он не имеет прямого доступа к значениям по ключу.

В этом сообщении нет ответа на вопрос, как анализировать строку json и получать доступ к элементам подмассива из неизвестных ключей первого уровня. Это не ответ и должен быть комментарием под вопросом. Похоже, вы рекомендуете, чтобы файл был прочитан, а затем изменен строковыми функциями в соответствии с вашими предпочтениями. Я не понимаю.

Нет, я указываю, что структура файла не соответствует цели, которую он читает. И поэтому он действительно отвечает на вопрос. И, похоже, вы действительно этого не понимаете, потому что я ничего не сказал о строковых функциях. Это просто глупо.



Ответы

Попробуйте это не имеют большого значения для StackOverflow, потому что они мало что дают для обучения ОП и будущих исследователей. Если вы собираетесь оставить этот ответ на странице, объясните, как работает ваш ответ и почему это целесообразно.

Ответы

Попробуйте это не имеют большого значения для StackOverflow, потому что они мало что дают для обучения ОП и будущих исследователей. Если вы собираетесь оставить этот ответ на странице, объясните, как работает ваш ответ и почему это целесообразно.

Более стандартный ответ:

И результат:


Ответы, содержащие только код, не имеют большого значения для StackOverflow, поскольку они мало что дают для обучения ОП и будущих исследователей. Если вы собираетесь оставить этот ответ на странице, объясните, как работает ваш ответ и почему это целесообразно.

Нет смысла вызывать здесь array_keys(), когда следующий цикл foreach() может предоставить данные сам по себе. Я не думаю, что согласен с «более стандартным», и я могу придумать несколько лучших имен переменных по сравнению с $val .

Проходите через JSON с помощью цикла foreach в виде пар "ключ-значение". Выполните проверку типов, чтобы определить, нужно ли делать больше циклов.


Ответы, содержащие только код, не имеют большого значения для StackOverflow, поскольку они мало что дают для обучения ОП и будущих исследователей. Если вы собираетесь оставить этот ответ на странице, объясните, как работает ваш ответ и почему это целесообразно.

Вместо того, чтобы игнорировать образец данных, предоставленный ОП, попробуйте ответить на вопрос таким образом, чтобы он был непосредственно и непосредственно связан с опубликованным вопросом.


Ответы

Попробуйте это не имеют большого значения для StackOverflow, потому что они мало что дают для обучения ОП и будущих исследователей. Если вы собираетесь оставить этот ответ на странице, объясните, как работает ваш ответ и почему это целесообразно.

При декодировании строки json вы получите объект. не массив. Таким образом, лучший способ увидеть структуру, которую вы получаете, - это сделать var_dump декодирования. (этот var_dump может помочь вам понять структуру, в основном в сложных случаях).


Привет, это вполне может решить проблему. но было бы хорошо, если бы вы могли отредактировать свой ответ и дать немного больше объяснений о том, как и почему это работает :) Не забывайте - в переполнении стека куча новичков, и они могли бы кое-что узнать из вашего опыт - то, что очевидно для вас, может быть не так для них.

Самый быстрый способ отобразить все значения json — использовать цикл в цикле, первый цикл получает все объекты, а второй — значения.


Вы должны дать вот так:

Что дает результат:


Ответы

Do Like This не имеют большого значения для StackOverflow, потому что они мало что дают для обучения ОП и будущих исследователей. Если вы собираетесь оставить этот ответ на странице, объясните, как работает ваш ответ и почему это целесообразно.

Похоже, этот ответ неправильно понимает вопрос. OP заранее не знает «имя» ключей, поэтому их нельзя жестко запрограммировать. Этот ответ неверен.

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

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

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


empty() — это ненужные накладные расходы. Просто используйте !json_last_error() . Кроме того, это не отвечает на вопрос, заданный ФП. Это не «Как преобразовывать значения в массивы» и не «как проверять ошибки JSON». Я помечаю это сообщение как не ответ.

Но никто не рассмотрел случай, если json искажен, поэтому только json_decode() недостаточно, следует также проверить правильность json, это ваш думающий человек, отмеченный, если хотите, я здесь не для того, чтобы зарабатывать баллы, так как решения только для разработчиков недостаточно, есть и плюсы и минусы,

Каждый ответ должен точно отвечать на заданный вопрос. Если бы каждый ответ сводился к соответствующей теме, исследователям было бы намного сложнее найти решения, которые они на самом деле ищут, на страницах Stackoverflow. Иногда я упаковываю свои ответы с проверкой ошибок (обычно с моими ответами mysql), потому что это разумное дополнение к правильному решению. Например, я бы никогда не публиковал инструкции об ошибках в вопросе «Как выполнить перекрестное соединение», потому что это не дало бы ответа на опубликованный вопрос. Теперь вы понимаете, почему ваш пост неуместен? Он упустил из виду вопрос.

Обычно JSON используется для чтения данных с веб-сервера и отображения данных на веб-странице.

В этой главе вы узнаете, как обмениваться данными JSON между клиентом и сервером PHP.

Файл PHP

В PHP есть несколько встроенных функций для обработки JSON.

Объекты в PHP можно преобразовать в JSON с помощью функции PHP json_encode() :

Файл PHP

name = "Джон";
$myObj->age = 30;
$myObj->city = "Нью-Йорк";

Клиентский JavaScript

Вот код JavaScript на клиенте, использующий вызов AJAX для запроса файла PHP из приведенного выше примера:

Пример

Используйте JSON.parse() для преобразования результата в объект JavaScript:

Массив PHP

Массивы в PHP также будут преобразованы в JSON при использовании функции PHP json_encode():

Файл PHP

Клиентский JavaScript

Вот код JavaScript на клиенте, использующий вызов AJAX для запроса файла PHP из приведенного выше примера массива:

Пример

Используйте JSON.parse() для преобразования результата в массив JavaScript:

База данных PHP

PHP — это серверный язык программирования, который можно использовать для доступа к базе данных.

Представьте, что у вас есть база данных на вашем сервере, и вы хотите отправить к ней запрос от клиента, где вы запрашиваете 10 первых строк в таблице под названием "клиенты".

На клиенте создайте объект JSON, описывающий количество строк, которые вы хотите вернуть.

Прежде чем отправлять запрос на сервер, преобразуйте объект JSON в строку и отправьте его в качестве параметра URL-адресу страницы PHP:

Пример

Используйте JSON.stringify() для преобразования объекта JavaScript в JSON:

Объяснение примера:

  • Определить объект, содержащий свойство и значение limit.
  • Преобразовать объект в строку JSON.
  • Отправьте запрос к файлу PHP со строкой JSON в качестве параметра.
  • Подождите, пока запрос вернется с результатом (в формате JSON)
  • Отобразить результат, полученный из файла PHP.

Взгляните на файл PHP:

Файл PHP

prepare("ВЫБЕРИТЕ имя ИЗ ПРЕДЕЛА клиентов?");
$stmt->bind_param("s", $obj->limit);
$stmt->execute();
$result = $stmt->get_result();
$outp = $result->fetch_all(MYSQLI_ASSOC);

Объяснение файла PHP:

  • Преобразуйте запрос в объект, используя функцию PHP json_decode().
  • Доступ к базе данных и заполнение массива запрошенными данными.
  • Добавьте массив к объекту и верните объект в формате JSON с помощью функции json_encode().

Использовать данные

Пример

xmlhttp.onload = function() <
const myObj = JSON.parse(this.responseText);
пусть текст = "";
for (пусть x в myObj) <
text += myObj[x].name + "
";
>
document.getElementById("demo").innerHTML = text;
>

Метод PHP = POST

Чтобы отправлять запросы AJAX с использованием метода POST, укажите метод и правильный заголовок.

Данные, отправляемые на сервер, теперь должны быть аргументом метода send():

Пример

Единственное различие в файле PHP — это способ получения переданных данных.

Файл PHP

Используйте $_POST вместо $_GET:

prepare("ВЫБЕРИТЕ имя ИЗ ПРЕДЕЛА клиентов?");
$stmt->bind_param("s", $obj->limit);
$stmt->execute();
$result = $stmt->get_result();
$outp = $result->fetch_all(MYSQLI_ASSOC);

Читайте также: