Solved: “Unable to Unserialize Value” in Magento 2.2

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.

Table of Contents