Вы могли бы быть в состоянии использовать mb_detect_encoding (), чтобы угадать, какую кодировку символов вы получаете, но эвристика, связанная с угадыванием кодировки символов, менее чем на 100% надежна, поэтому она все еще может не работать и, что еще хуже, вы можете исказить строку, которая была действительной.
Если источник JSON отправляет заголовок типа содержимого, он также должен включать (предполагаемую) кодировку символов.
Content-Type: application/json; charset=ISO-8859-4
Если эта информация точна, вы можете использовать ее для перекодирования.