2015-09-14 2 views
2

Я не реально получить следующее ...PHP json_decode в json_encoded строку

// array to encode 
$a = ['regex' => '\/\+\/']; 

// decoding an encoded array works 
print_r(json_decode(json_encode($a), true)); 

// encoded array 
echo json_encode($a); 

// trying to decode the before encoded string doesn't work 
print_r(json_decode('{"regex":"\\\/\\+\\\/"}', true)); 
echo json_last_error_msg(); 

последнее сообщение об ошибке говорит Syntax error. Разве я не могу легко декодировать простую закодированную строку?

Я знаю, что проблема в обратных косых чертах, но я не хочу делать замену магической строки или регулярное выражение, чтобы заставить работать декодирование. Просто хотите понять, где идет то, что неправильно, и что является лучшей практикой для подобных ситуаций?

Я использую PHP версии 5.5.9

+0

Хм. На той же версии php у меня есть ошибка «неправильной строки последовательности» –

ответ

4

нашел что-то благодаря этому ответу: https://stackoverflow.com/a/10929508/1685538

Если вместо того, чтобы строка, выведенная echo, вы используете var_export(json_encode($a)); (documentation), это дает вам {"regex":"\\\\\\/\\\\+\\\\\\/"}

print_r(json_decode('{"regex":"\\\\\\/\\\\+\\\\\\/"}', true)); дает ожидаемый результат:

Array 
(
    [regex] => \/\+\/ 
) 

без ошибок.

+1

Прохладный, спасибо, полезный – va5ja

+0

Если это все, что вам нужно, подумайте о принятии ответа @ va5ja – HectorJ

1

Проблема в том, что использование обратных косых черт в Строковые литералы PHP code подчиняются правилам обратного слэша PHP. Вам нужно дополнительно избежать обратной косой черты, чтобы они сохранились внутри PHP строку:

print_r(json_decode('{"regex":"\\\\\\/\\\\+\\\\\\/"}', true)); 

Контраст с:

echo '{"regex":"\\\/\\+\\\/"}'; 
// {"regex":"\\/\+\\/"}