Предполагается, что это общий справочный вопрос и ответ, охватывающий многие бесконечные вопросы «Как получить доступ к данным в моем JSON?» вопросы. Это здесь, чтобы справиться с широкими основами декодирования JSON в PHP и доступа к результатам.
У меня есть JSON:
{
"type": "donut",
"name": "Cake",
"toppings": [
{ "id": "5002", "type": "Glazed" },
{ "id": "5006", "type": "Chocolate with Sprinkles" },
{ "id": "5004", "type": "Maple" }
]
}
Как мне декодировать это в PHP и получить доступ к полученным данным?
Ответы:
вступление
Во-первых, у вас есть строка. JSON не является массивом, объектом или структурой данных. JSON - это текстовый формат сериализации - необычная строка, но все же просто строка. Расшифруйте его в PHP с помощью
json_decode()
.Там вы можете найти:
Это те вещи, которые могут быть закодированы в JSON. Точнее, это версии PHP вещей, которые можно кодировать в JSON.
В них нет ничего особенного. Они не являются «объектами JSON» или «массивами JSON». Вы расшифровали JSON - теперь у вас есть базовые повседневные типы PHP .
Объекты будут экземплярами stdClass , встроенного класса, который является просто общей вещью, которая здесь не важна.
Доступ к свойствам объекта
Вы получаете доступ к свойствам одного из этих объектов так же, как и к общедоступным нестатическим свойствам любого другого объекта, например
$object->property
.Доступ к элементам массива
Вы получаете доступ к элементам одного из этих массивов так же, как и для любого другого массива, например
$array[0]
.Переберите его с
foreach
.Или возиться с любой из встроенных функций массива bazillion .
Доступ к вложенным элементам
Свойства объектов и элементов массивов могут быть больше объектов и / или массивов - вы можете просто продолжать получать доступ к их свойствам и членам, как обычно, например
$object->array[0]->etc
.Передача
true
в качестве второго аргумента json_decode ()Когда вы сделаете это, вместо объектов вы получите ассоциативные массивы - массивы со строками для ключей. Снова вы получаете доступ к его элементам, как обычно, например
$array['key']
.Доступ к элементам ассоциативного массива
При декодировании объекта JSON в ассоциативный массив PHP вы можете выполнять итерации ключей и значений с использованием
foreach (array_expression as $key => $value)
синтаксиса, например:Печать
Не знаю, как структурированы данные
Прочитайте документацию о том, что вы получаете JSON.
Посмотрите на JSON - где вы видите, что фигурные скобки
{}
ожидают объект, а квадратные скобки[]
ожидают массив.Хит декодированные данные с
print_r()
:и проверьте вывод:
Он скажет вам, где у вас есть объекты, где у вас есть массивы, а также имена и значения их членов.
Если вы можете получить только до сих пор в него , прежде чем вы заблудились - идти так далеко и удар , который с
print_r()
:Посмотрите на это в этом удобном интерактивном проводнике JSON .
Разбейте проблему на части, которые легче обернуть вокруг.
json_decode()
возвращаетсяnull
Это происходит потому, что либо:
null
.json_last_error_msg
или пропустите его через что-то вроде JSONLint .json_decode()
.Если вам нужно изменить максимальную глубину, вы, вероятно, решаете не ту проблему. Узнайте, почему вы получаете такие глубоко вложенные данные (например, запрашиваемая служба, которая генерирует JSON, содержит ошибку) и убедитесь, что этого не происходит.
Имя свойства объекта содержит специальный символ
Иногда у вас будет имя свойства объекта, содержащее что-то вроде дефиса
-
или знака,@
которое нельзя использовать в литеральном идентификаторе. Вместо этого вы можете использовать строковый литерал в фигурных скобках, чтобы обратиться к нему.Если у вас есть целое число как свойство, см .: Как получить доступ к свойствам объекта с именами, такими как целые числа? как ссылки.
Кто-то положил JSON в ваш JSON
Это смешно, но бывает - в вашем JSON есть кодировка в виде строки. Decode, доступ строка как обычно, расшифровывает , что , и в конечном итоге получить то, что вам нужно.
Данные не помещаются в памяти
Если ваш JSON слишком велик для того,
json_decode()
чтобы обрабатывать его сразу, все становится сложнее. Видеть:Как отсортировать
См .: Справочник: все основные способы сортировки массивов и данных в PHP .
источник
Вы можете использовать json_decode () для преобразования строки json в объект / массив PHP.
Например.
Входные данные:
Вывод:
Несколько моментов для запоминания:
json_decode
требует, чтобы строка была действительной,json
иначе она вернетсяNULL
.json_last_error()
может быть использован точный характер определения ошибки.utf8
содержимое илиjson_decode
можете выдать ошибку и просто вернутьNULL
значение.источник
источник
Мы можем декодировать строку json в массив, используя функцию json_decode в php
1) json_decode ($ json_string) // возвращает объект
2) json_decode ($ json_string, true) // возвращает массив
источник
Рассмотрите возможность использования
JSONPath
https://packagist.org/packages/flow/jsonpathСуществует довольно четкое объяснение того, как его использовать и анализировать JSON-файл, избегая всех предложенных циклов . Если вы знакомы с
XPath
дляXML
вы начнете любить этот подход.источник
Я написал пакет с именем
JSON
( GitHub , Packagist ). Если вы хотите избежать накладных расходов на использованиеjson_*
функций, попробуйте это.пример
Посмотрите вики или краткое руководство, чтобы ознакомиться с ним.
Кроме того, если вы хотите прочитать файлы JSON и извлечь их данные (как вы, кажется, пытаетесь это сделать), посмотрите пакет JSONFile , который я тоже написал.
источник
https://paiza.io/projects/X1QjjBkA8mDo6oVh-J_63w
Проверьте приведенный ниже код для преобразования json в массив.
PHP
Если JSON верен, тоjson_decode()
работает хорошо и вернет массив, но если искажен JSON, то он вернетсяNULL
,Если JSON искажен, и вы ожидаете только массив, то вы можете использовать эту функцию,
Если JSON искажен, и вы хотите остановить выполнение кода, то вы можете использовать эту функцию,
Вы можете использовать любую функцию в зависимости от ваших требований,
источник