обнаружена рекурсия в кодировке json

В Chrome PHP объекты преобразуются в json через json_encode перед отправкой в ​​заголовок ответа. Это не работает с объектами, которые содержат рекурсии — вызов json_last_error_msg() говорит recursion detected и вывод пуст. Есть ли способ предотвратить это, например, обрезание рекурсий или что-то еще?

 protected function _encode($data) {
$ret = base64_encode(utf8_encode($json = json_encode($data)));
if (!$json) {
print_r(json_last_error_msg()); //says 'recursion detected, when recursion found'
return "";
}
return $ret;
}

1

Решение

Я использовал эту функцию, чтобы «исправить» объекты некоторое время — кажется, что он отлично справляется с преобразованием частных и защищенных объектов в «stdClass», где я могу затем просматривать и использовать данные.

function fix_object( $object ) {
$dump = serialize( $object );
//  print_r($dump); echo "<hr>";
$dump = str_replace('s:6:"series";r:1;','s:6:"series";s:6:"series";',$dump);
// print_r($dump); echo "<hr>";
$dump = preg_replace( '/^O:\d+:"[^"]++"/', 'O:8:"stdClass"', $dump );
$dump = preg_replace_callback( '/:\d+:"\0.*?\0([^"]+)"/', function($matches){
return ":" . strlen( $matches[1] ) . ":\"" . $matches[1] . "\"";}, $dump );
return unserialize( $dump );
}

Смотрите строку между ‘print_r ($ dump);’ линии — это единственное, что вам нужно изменить для ваших собственных объектов (я положил » ‘вокруг свалки), чтобы увеличить расстояние …)

В моем случае, как вы можете видеть, я обнаружил, что в ‘series’ есть ‘r: 1’, что заставило json_encode выдать ошибку, обнаруженную рекурсией.

Просматривая дамп сериализации, я обнаружил это и заменил его строкой (вы можете поместить все, что не нарушает json, но будьте осторожны!)

Поскольку часть, которая была рекурсивной, не была нужна (уже в объекте …), не имело значения, на что я ее заменил.

Конечный результат — очень хороший, без ошибок json_encode!

 echo "json series = " . json_encode(fix_object( $origObject)) . "<br>";

Как указано в комментариях к вопросу, вы должны быть осторожны при использовании таких вещей, как удаление «частных» или «защищенных» данных может быть плохой вещью. В некоторых случаях, однако, разработчик просто помещает все как «личное» или «защищенное» (даже когда это действительно не должно быть…) — в этих случаях эта функция спасает жизнь!

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]