Если есть возможность повлиять на то, каким именно образом прилетает JSON, то можно попросить разделять их, к примеру, переводом строки. Перевод строки в самом [не pretty] JSON встречаться не может, в строках он будет экранирован, а потому можно наращивать прочитанные из сокета данные до тех пор, пока не встретится перевод строки, и то, что перед ним, кормить json.loads, а остальное продолжать наращивать.