I had the same error and after trying to fix the serialized string I ended up understanding that it was impossible. I tried everything from this great thread, but either the proposed solution wouldn't work either some information would get losted when fixing the string.
The simplest solution I found was to add a try and catch at the line 81 of this file: src/vendor/magento/data-migration-tool/src/Migration/Handler/SerializeToJson/SalesOrderItem.php
Just add a try and catch here:
$optionValue = $option['option_value'] ? unserialize($option['option_value']) :
$option['option_value'];
- That would prevent the issue from stopping the migration
- The custom options wrongly generated in Magento 1 wouldn't be imported (but they were already wrong in magento 1)
More detailed information you can find it here.