Как получить нужные данные из JSON?

120
08 июня 2021, 18:10

Пытаюсь получить данные из Json, но ничего не получается.

Функция

public function getItem($id)
{
    $response = @json_decode($this->request('GET', 'https:// site.ru/ap/my/op?search=' . $id)['body'], true);
    if (isset($response['error'])) {
        throw new Exception($response['error']);
    }
    return new MyItem($response);
  }

Отдает

var_dump ($items);
object(MyItem)#120 (1) {
["data":protected]=>
array(1) {
[0]=>
array(16) {
  ["dtoType"]=>
  string(7) "partner"
  ["id"]=>
  int(3228933)
  ["userId"]=>
  int(571106)
  ["sellerReward"]=>
  float(180)
  ["createdAt"]=>
  string(24) "2019-08-16T05:18:05.309Z"
  ["status"]=>
  string(8) "APPROVED"
  ["currency"]=>
  string(3) "RUR"
  ["income"]=>
  float(270)
  ["customer"]=>
  array(3) {
    ["id"]=>
    int(1118038)
    ["fio"]=>
    string(27) "Валера"
    ["email"]=>
    string(28) "valera111953@mail.ru"
  }
  ["ware"]=>
  array(4) {
    ["id"]=>
    int(178109)
    ["title"]=>
    string(93) "Прокат за месяц!"
    ["type"]=>
    string(7) "DIGITAL"
    ["userId"]=>
    int(571106)
  }
  ["paymentSystem"]=>
  string(4) "visa"
  ["paymentSystemGroup"]=>
  string(10) "creditCard"
  ["total"]=>
  float(550)
  ["ipAddress"]=>
  string(13) "37.71.177.737"
  ["isOneTimeOffer"]=>
  bool(false)
  ["orderType"]=>
  string(9) "WARE_SALE"
  }
 }
}
echo $items->ware['title'];
echo $items->title;
echo $items['title'];

отдают ошибку Fatal error: Uncaught Exception: There is no column "ware" in и atal error: Uncaught Error: Cannot use object of type MyItem as array in

Помогите правильно запросить данные.

Спасибо!

Answer 1

Как видно по var_dump, вы рассматриваете объект класса MyItem. Соответственно то что выводит var_dump может быть, а может и не быть способом достичь желаемые данные. Свойство data однозначно отмечено как protected и потому снаружи будет недоступно.

У класса MyItem есть два геттера: метод only и магический метод __get. Приключений добавляет то что на верхнем уровне вашего data - числовой массив. Поэтому обращаться к нему требуется именно как к числу. Синтаксически корректно это пишется так:

$obj = new MyItem([0=> ['title' => 'bar']]);
var_dump($obj->{0}['title']);

Либо через only достать весь элемент

var_dump($obj->only([0]));
Answer 2
// 1. Создаем экземпляр класса MyItem, на вход передаем данные (тестовые)
$items = new MyItem([
    "firstField" => 1,
    "secondField" => 2,
]);
// 2. Выводим в консоль поле firstField
print_r($items->only(["firstField"]));

Вывод в консоль:

Array
(
    [firstField] => 1
)

Получить значение можно также:

print_r($items->__get("firstField"));

Вывод в консоль:

1
READ ALSO
Возвратить массив из функции

Возвратить массив из функции

Данная функция должна возвратить массив с папками БЕЗ использования глобальных переменныхПодскажите, пожалуйста, как это сделать?

178
Не добавляется телефон в amocrm

Не добавляется телефон в amocrm

ЗадачаСоздать контакт и добавить к нему телефон

197