Вопрос: этот JSON мы разбираем или нет?
Для простоты предположим, что разбираем (ну или транслятор JS разбирает — всё едино). Тогда текст у нас закодирован в UTF-16.
• Символы 0000…D7FF — они и есть.
• Символы D800…DBFF — за этим символом должен идти символ из DC00…DFFF, и они образуют суррогатную пару, которая будет одним символом. Подробнее гугли «UTF-16». Если идёт один из этих двух символов без пары — это некорректный UTF-16.
• И символы E000…FFFF также кодируются как есть.
Вот эта суррогатная пара, которую ты подкинул, кодируется в символ 1F345, помидор какой-то.
Функция конвертации суррогатной пары в код символа:
charCode = 0x10000 + ((leadingCode & 0x3FF) << 10) + (trailingCode & 0x3FF)
А уж какие коды вам не нужны — копайте таблицы Юникода.
Более простой способ, который вам может подойти — запретить все суррогатные пары.