Содержание
- 1 Решение
- 1.1 вступление
- 1.2 Доступ к свойствам объекта
- 1.3 Доступ к элементам массива
- 1.4 Доступ к вложенным элементам
- 1.5 Переходя true в качестве второго аргумента json_decode ()
- 1.6 Не знаю, как структурированы данные
- 1.7 json_decode() возвращается null
- 1.8 Имя свойства объекта содержит специальный символ
- 1.9 Кто-то положил JSON в ваш JSON
- 1.10 Данные не помещаются в памяти
- 1.11 Как это отсортировать
- 2 Другие решения
- 3 1 ответ 1
Предполагается, что это общий справочный вопрос и ответ, охватывающий многие бесконечные вопросы. «Как мне получить доступ к данным в моем JSON?» вопросы. Это здесь, чтобы справиться с широкими основами декодирования JSON в PHP и доступа к результатам.
У меня есть JSON:
Как мне декодировать это в PHP и получить доступ к полученным данным?
Решение
вступление
Во-первых, у вас есть строка. JSON не является массивом, объектом или структурой данных. JSON текстовый формат сериализации — это необычная строка, но все же просто строка. Расшифруйте его в PHP с помощью json_decode() .
Там вы можете найти:
- скаляры: строки , Интс , поплавки , а также Bools
- обнуляет (особый тип своего собственного)
- составные типы: объекты а также массивы .
Это те вещи, которые могут быть закодированы в JSON. Точнее, это версии PHP вещей, которые можно кодировать в JSON.
В них нет ничего особенного. Они не являются «объектами JSON» или «массивами JSON». Вы расшифровали JSON — теперь у вас есть основные повседневные типы PHP .
Объекты будут экземплярами Std > , встроенный класс, который просто универсальная вещь это не важно здесь.
Доступ к свойствам объекта
Вы получаете доступ к свойства одного из этих объектов так же, как и для открытых нестатических свойств любого другого объекта, например, $object->property ,
Доступ к элементам массива
Вы получаете доступ к элементам одного из этих массивов так же, как и для любого другого массива, например, $array[0] .
Переберите его с foreach .
глазированный
Шоколад с окропляет
кленовый
Доступ к вложенным элементам
Свойства объектов и элементов массивов могут быть больше объектов и / или массивов — вы можете просто продолжать получать доступ к их свойствам и элементам, как обычно, например, $object->array[0]->etc ,
Переходя true в качестве второго аргумента json_decode ()
Когда вы сделаете это, вместо объектов вы получите ассоциативные массивы — массивы со строками для ключей. Снова вы получаете доступ к его элементам, как обычно, например, $array[‘key’] ,
Не знаю, как структурированы данные
Прочитайте документацию о том, что вы получаете JSON.
Посмотрите на JSON — где вы видите фигурные скобки <> ожидать объект, где вы видите квадратные скобки [] ожидать массив.
Хит декодированные данные с print_r() :
и проверьте вывод:
Он скажет вам, где у вас есть объекты, где у вас есть массивы, а также имена и значения их членов.
Если вы можете зайти так далеко, прежде чем заблудитесь — зайдите так далеко и нажмите тот с print_r() :
Разбейте проблему на части, которые легче обернуть вокруг.
json_decode() возвращается null
Это происходит потому, что либо:
- JSON состоит исключительно из этого, null ,
- JSON недействителен — проверьте результат json_last_error_msg или поставить что-то вроде JSONLint .
- Он содержит элементы, вложенные более 512 уровней. Эту максимальную глубину по умолчанию можно изменить, передав целое число в качестве третьего аргумента json_decode() .
Если вам нужно изменить максимальную глубину, вы, вероятно, решаете не ту проблему. Узнайте, почему вы получаете такие глубоко вложенные данные (например, запрашиваемая служба, которая генерирует JSON, имеет ошибку) и убедитесь, что этого не происходит.
Имя свойства объекта содержит специальный символ
Иногда у вас будет имя свойства объекта, которое содержит что-то вроде дефиса — или в знак @ который не может быть использован в литеральном идентификаторе. Вместо этого вы можете использовать строковый литерал в фигурных скобках для адресации.
Кто-то положил JSON в ваш JSON
Это смешно, но это случается — в вашем JSON есть кодировка в виде строки. Расшифруйте, получите доступ к строке как обычно, расшифруйте тот, и в конце концов получите то, что вам нужно.
Данные не помещаются в памяти
Если ваш JSON слишком велик для json_decode() чтобы справиться сразу все становится сложнее. Увидеть:
Как это отсортировать
Другие решения
Ты можешь использовать json_decode () преобразовать строку json в объект / массив PHP.
Входные данные:
Выход:
Несколько моментов для запоминания:
- json_decode требует, чтобы строка была действительной json иначе он вернется NULL ,
- В случае невозможности декодирования, json_last_error() может быть использован для определения точного характера ошибки.
- Убедитесь, что вы проходите utf8 содержание или json_decode может выдать ошибку и просто вернуть NULL значение.
Я написал пакет с именем JSON (GitHub , Packagist ). Если вы хотите предотвратить накладные расходы на использование json_* функции, вы должны попробовать это.
пример
Увидеть вики , или же краткое руководство познакомиться с этим.
Кроме того, если вы хотите прочитать файлы JSON и извлечь их данные (как вам кажется, вы пытаетесь это сделать), см. JSONFile пакет, о котором я тоже написал.
API яндекса говорит о том, что по некому урл, который Я укажу уйдет пост в json, на который Я должен дать ответ
Если Я просто в файле для проверки делаю так:
То вся игра идет хорошо. Если пытаюсь получить json через POST вот так: $responseJson = $_POST[‘cart’]; , то ничего не выходит. Пусто. Я не верно получаю json данные?
1 ответ 1
ПХП по умолчанию не парсит запросы кроме application/x-www-form-urlencoded multipart/form-data . Т.е. тельце надо парсить самому.
Можно проверить что бы $_SERVER["CONTENT_TYPE"] == ‘application/json’ до и что значение json_decode не NULL после.
А тело парсится так:
Кстати ещё как дополнение: ПХП не парсит PUT/DELETE. запросы.
Дата публикации: 2017-04-25
От автора: когда я работал в Mozilla, мне нужно было написать транзакцию аутентификации типа OAuth между Bugzilla и Phabricator. Эта задача вынудила меня вернуться в мир PHP, к языку, который я давно не использую (с версии
5.2). С помощью PHP я только создаю темы и плагины на WP для своего блога. Возврат к языку, который не практиковался годами, кажется чем-то совершенно новым. Начинаешь замечать шаблоны и методы, о которых и не догадывался раньше.
Где-то в транзакции аутентификации Phabricator должен был получать POST-запрос с JSON. Я думал, что данные окажутся в глобальном массиве $_POST, однако переменная была пуста. И как же мне получить POST-данные? Получить POST JSON в PHP можно с помощью следующих строк: