Ever faced an error like “unable to unserialize value” while working with system configuration in Magento 2.2 admin panel? It is because of the \Magento\Framework\Serialize\Serializer\Json class.
The file vendor/magento/framework/Serialize/Serializer/Json.php is causing the problem. The function unserialize($string) returns an exception if the string is already serialized.
Solution for “Unable to Unserialize Value” in Magento 2.2:
Open vendor/magento/framework/Serialize/Serializer/Json.php file.
Find the following funcion in file.
public function unserialize($string)
{
$result = json_decode($string, true);
if (json_last_error() !== JSON_ERROR_NONE) {
throw new \InvalidArgumentException('Unable to unserialize value.');
}
return $result;
}
Modify the function by adding the following code:
public function unserialize($string)
{
/* Added this code to resolve the issue */
if($this->is_serialized($string)){
$string = $this->serialize($string);
}
/*---------------------------------*/
$result = json_decode($string, true);
if (json_last_error() !== JSON_ERROR_NONE) {
throw new \InvalidArgumentException('Unable to unserialize value.');
}
return $result;
}
Add is_serialized() function in same file vendor/magento/framework/Serialize/Serializer/Json.php at the end:
function is_serialized($value, &$result = null)
{
// Bit of a give away this one
if (!is_string($value)) {
return false;
}
// Serialized false, return true. unserialize() returns false on an
// invalid string or it could return false if the string is serialized
// false, eliminate that possibility.
if ($value === 'b:0;') {
$result = false;
return true;
}
$length = strlen($value);
$end = '';
switch ($value[0]) {
case 's':
if ($value[$length - 2] !== '"') {
return false;
}
case 'b':
case 'i':
case 'd':
// This looks odd but it is quicker than isset()ing
$end .= ';';
case 'a':
case 'O':
$end .= '}';
if ($value[1] !== ':') {
return false;
}
switch ($value[2]) {
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
break;
default:
return false;
}
case 'N':
$end .= ';';
if ($value[$length - 1] !== $end[0]) {
return false;
}
break;
default:
return false;
}
if (($result = @unserialize($value)) === false) {
$result = null;
return false;
}
return true;
}
Unserialize the previous values and serialize them back with json. Implement the above code to solve the error “Unable to Unserialize Value” in Magento 2.2.