Парсинг JSON

Рейтинг: 0Ответов: 1Опубликовано: 17.12.2014

Подскажите решение, как на PHP спарсить JSON, в котором попадаются подобного рода вещи:

{"accDo": "a:2:{s:3:"get";s:1:"1";s:4:"take";s:1:"1";}"}

Стандартные средства возвращают ошибку синтаксиса.

Ответы

▲ 2Принят

@nddd, догадываюсь, в чём проблемка. Было примерно следующее:

$arr = array (
    'accDo' => array ( 'get' => '1', 'take' => '1', )
);
foreach($arr as $k => $v){
    $arr[$k] = serialize($v);
}

Результат:

{"accDo":"a:2:{s:3:\"get\";s:1:\"1\";s:4:\"take\";s:1:\"1\";}"}

Слэши были удалены или перед внесением в БД, или уже после вывода. Кто вообще додумался преобразовывать двумя методами?..

Обновление

@nddd, по регуляркам на форуме есть более компетентные люди, но пока могу предложить такой вариант:

// Исходная строка
$wrongStr = '{"accDo":"a:2:{s:3:"get";s:1:"1";s:4:"take";s:1:"1";}"}';
// К сериализованной части применяем addslashes()
$normalStr = preg_replace_callback(
    '/a:\d+:([^}]+)}/',
    create_function(
        '$matches',
        'return addslashes($matches[0]);'
    ),
    $wrongStr
);
// декодирование
$arr = json_decode($normalStr, 1);
print_r( unserialize($arr['accDo']) );

Результат

Array
(
    [get] => 1
    [take] => 1
)

Но повторюсь, что регулярку хорошо бы доработать