Tach!
Je nach gesendetem Content-Type stellt der Parser auch in PHP die Daten wieder her für einen wahlfreien Zugriff. Üblich sind 'application/x-www-form-urlencoded' und 'multipart/form-data' und der wahlfreie Zugriff ergibt sich nach dem Parsen über $_POST//$_GET je nachdem wo die Daten herkommen. Auf jeden Fall fragt auch in PHP der Parser den gesendeten Content-Type ab, denn er muss ja wissen nach welchem Algorithmus die Daten wiederhergestellt werden sollen.
Wenn die Daten an der Quelle nicht richtig eingepackt wurden, im Sinne der beiden Content-Typen, dann treten die vom OP beobachten Symptome auf.
Eine Überlegung, dass ebendieser Parser bei einem gesendeten Content-Type: application/json die wiederhergestellte Datenstruktur direkt ins $_POST Array schreibt ist also naheliegend, aber ob er das wirklich macht, kann ich momentan nicht sagen (das wäre zu prüfen).
Macht er nicht. Wenn man die Daten in $_POST haben möchte, muss man die beiden genannten Content-Typen verwenden. PHP hat $_GET/$_POST zu einer Zeit implementiert, als alle Browser noch brav nur Formulare schicken konnten. Die beiden Arrays beziehen sich nur auf das method-Attribut von Formularen und behandelt die Daten gemäß den von den Browsern dafür verwendeten Content-Typen. Dass man seit einiger Zeit Ajax-Requests mit anderen Content-Typen versenden kann, ist in der Hinsicht an PHP vorübergegangen. Das heißt, $_GET und $_POST werden dann nicht befüllt.
Es wäre ein impliziter Aufruf $_POST = json_decode(STDIN); um das mal so zu formulieren.
Das passiert nicht. Man kann sich bei PHP entweder die Rohdaten direkt aus dem Request holen (das ist für PHP eher unüblich) oder man holt holt sich die dekodierten Daten aus $_POST, wenn es Formulardaten waren.
Im Falle des OP waren es offensichtlich keine Rohdaten. Denn dann wäre in aller Regel kein Dekodierfehler nach den beschriebenen Symptomen aufgetreten. Also wird er sie wohl aus $_POST abholen und an der Quelle als application/x-www-form-urlencoded (Standard-Wert für Ajax) versenden. Dabei wird er nicht beachtet haben, dass sie kodiert werden müssen. Und dann tritt das auf, was er beschrieben hat.
dedlfix.