Как извлечь данные из JSON с помощью PHP?

Это предназначено для общего справочного вопроса и ответа, охватывающего многие из бесконечных «Как мне получить доступ к данным в моем 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() .

  $data = json_decode($json); 

Там вы можете найти:

  • скаляры: строки , ints , floats и bools
  • nulls (особый тип)
  • составные типы: объекты и массивы .

Это те вещи, которые могут быть закодированы в 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"; } 

глазированный
Шоколад с посыпками
кленовый

Или беспорядок с любой из встроенных функций массива bazillion .


Доступ к вложенным элементам

Свойства объектов и элементов массивов могут быть больше объектов и / или массивов – вы можете просто продолжать доступ к своим свойствам и членам, как обычно, например $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.

Посмотрите на 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() :

 print_r($yummy->toppings[0]); 
 stdClass Object ( [id] => 5002 [type] => Glazed ) 

Разбейте проблему на части, которые легче обернуть вокруг головы.


json_decode() возвращает null

Это происходит потому, что либо:

  1. JSON состоит исключительно из этого, null .
  2. JSON недействителен – проверьте результат json_last_error_msg или json_last_error_msg его через нечто вроде JSONLint .
  3. Он содержит элементы, вложенные в более чем 512 уровней. Эта максимальная глубина по умолчанию может быть переопределена путем передачи целого числа в качестве третьего аргумента в json_decode() .

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


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

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

 $json = '{"@attributes":{"answer":42}}'; $thing = json_decode($json); echo $thing->{'@attributes'}->answer; //42 

Если у вас есть свойство integer as, см.: Как получить доступ к свойствам объекта с именами, такими как целые числа? в качестве ссылки.


Кто-то поставил JSON в ваш JSON

Это смешно, но это происходит – JSON закодирован как строка в вашем JSON. Декодируйте, как обычно, получите доступ к строке, расшифруйте ее и, в конечном итоге, получите то, что вам нужно.

 $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() чтобы обращаться сразу, все начинает становиться сложным. Видеть:

  • Обработка больших файлов JSON в PHP
  • Как правильно выполнить итерацию через большой файл json

Как его сортировать

См .: Ссылка: все основные способы сортировки массивов и данных в PHP .

Вы можете использовать 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 else, она вернет NULL .
  • В случае отказа декодирования json_last_error() может использоваться для определения точного характера ошибки.
  • Убедитесь, что вы передаете содержимое utf8 , или json_decode может выйти из строя и просто вернуть значение NULL .