Как с помощью json_decode разобрать только первый уровень JSON?

165
19 декабря 2016, 19:30

В VK API есть загрузка фотографий для товаров (vk.com/dev). Одним из шагов загрузки является получение от VK такого JSON:

{"server":625831,"photo":"[{\"photo\":\"8d81799f90:w\",\"sizes\":[[\"s\",\"625831075\",\"45839\",\"-5fbUeQq1YY\",75,56],[\"m\",\"625831075\",\"4583a\",\"G8yAYbsk7M4\",130,97]]}]","hash":"8954a4da5ba06d4e","crop_data":"oAAmMpwAAAAAlTWyjA","crop_hash":"729155760247b391134"}

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

Обратите внимание, что ответ сервера всегда приходит в формате JSON, а поля server, photo, hash, crop_data и crop_hash в нем содержат строки, внутренний формат которых может изменяться со временем. В частности, строка photo может содержать другой JSON-объект, который не следует декодировать, разбирать на части или иным образом модифицировать.

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

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

<?php
$data = [
    'alice'=>[
        'age'=>30,
        'sex'=>'f',
    ],
    'bob'=>[
        'age'=>25,
        'sex'=>'m',
    ],
];
$json = json_encode($data);
//{"alice":{"age":30,"sex":"f"},"bob":{"age":25,"sex":"m"}}
$decoded = json_decode($json);
//набор объектов stdClass. Каждый объект имеет свои свойства. Json разложен полностью
$decodedAssoc = json_decode($json, TRUE);
//Ассоциативный массив. Json разложен полностью
$decodedDepth = json_decode($json, TRUE, 1);
//NULL Вложенных уровней больше чем указано
Answer 1

а вообще-то, если бы вы проверили, то api делает всё честно, внутренние json'ы переданы как строковые элементы, а не как чать структуры.

print_r(json_decode($str, true));

результат

Array
(
    [server] => 625831
    [photo] => [{"photo":"8d81799f90:w","sizes":[["s","625831075","45839","-5fbUeQq1YY",75,56],["m","625831075","4583a","G8yAYbsk7M4",130,97]]}]
    [hash] => 8954a4da5ba06d4e
    [crop_data] => oAAmMpwAAAAAlTWyjA
    [crop_hash] => 729155760247b391134
)
READ ALSO
Можно ли использовать autoload вне фреймворка?

Можно ли использовать autoload вне фреймворка?

Вот есть установленный композером Бутстрап

191
Как называются поля для входа в роутер? [закрыто]

Как называются поля для входа в роутер? [закрыто]

Нужно узнать name полей <input> для входа в роутер

213
При загрузке на amazon получаю не тот url

При загрузке на amazon получаю не тот url

Если я не ошибаюсь, то метод getObjectUrl, возвращает url для "внутреннего" использования и не предназначен для публичного использования

217
Как получить множество строк из одной таблицы для каждой строки из другой?

Как получить множество строк из одной таблицы для каждой строки из другой?

Есть таблица с объявлениями, для каждого объявления есть несколько категорий, все категории хранятся в одной таблицеУ таблицы объявлений...

217