protected function throwJsonException()
    {
        if (JSON_ERROR_NONE === json_last_error()) {
            return;
        }

        switch (json_last_error()) {
            case JSON_ERROR_DEPTH:
                $error = 'The maximum stack depth has been exceeded';
                break;

            case JSON_ERROR_STATE_MISMATCH:
                $error = 'Invalid or malformed JSON';
                break;

            case JSON_ERROR_CTRL_CHAR:
                $error = 'Control character error, possibly incorrectly encoded';
                break;

            case JSON_ERROR_SYNTAX:
                $error = 'Syntax error';
                break;

            case JSON_ERROR_UTF8:
                $error = 'Malformed UTF-8 characters, possibly incorrectly encoded';
                break;

            case JSON_ERROR_RECURSION:
                $error = 'One or more recursive references in the value to be encoded';
                break;

            case JSON_ERROR_INF_OR_NAN:
                $error = 'One or more NAN or INF values in the value to be encoded';
                break;

            case JSON_ERROR_UNSUPPORTED_TYPE:
                $error = 'A value of a type that cannot be encoded was given';
                break;

            default:
                $error = 'Occurred error.';
                break;
        }

        throw new InvalidArgumentException($error);
    }