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.