Man kann keine TStringList verwenden um mit TIdHTTP einen JSON String zu posten. TIdHTTP.Post() wird den Inhalt der TStringList in einer Art kodieren die die JSON Daten ungültig macht. Stattdessen muss der String in einen TStream geschrieben werden.
Diese Zeile ist überflüssig,
Indy berechnet die Länge selbst:
IdHTTP1.Request.ContentLength:= Length(sl.Text)* SizeOf(Char);
Auch das Angeben des Zeichensatzes im Post ist nicht notwendig:
showmessage(IdHTTP1.Post('https://www.test.de/jsonrpc.do', sl));