Tach!
Erstell einen Ajax-Request ohne Content-Type-Angabe oder nimm den Standard-Wert application/x-www-form-urlencoded. Sende als Payload sowas wie data=...
Aha, auf so eine Idee muss man ja erstmal kommen, das ging aus der Problembeschreibung leider nicht hervor.
Das ist aber eine der üblichen Verwendungen von Ajax-Requests. Auf diese Weise können die Daten in PHP einfach aus $_POST geholt werden, ohne dass man php://input bemühen muss.
Und das geht am Thema JSON auch völlig vorbei, es macht überhaupt keinen Sinn einen JSON so verwenden zu wollen!
Das würde mit allen Daten passieren, die so transportiert werden.
Nein eben nicht! Wenn nämlich der Content-Type 'application/x-www-form-urlencoded' gesendet wid, arbeitet der Parser entsprechend und deutet & als Trennzeichen sowie + als Leerzeichen (siehe auch RFC 3986). Somit ist es nicht nur unsinnig sondern auch falsch ein data=$json zu senden und dann in das $_POST Array zu greifen.
Wenn das bei Dir so üblich ist, hast Du den Sinn des Request-Content-Type nicht verstanden, aber diesen Eindruck hatte ich ja gestern schon.
Also entweder 'application/x-www-form-urlencoded' ODER 'application/json' senden und selbstverständlich muss das serverseitige Parsen dem im Request mitgegebenen Content-Type entsprechend erfolgen. Andererseits ist es auch unsinnig, ein Percent-Encoding gem. RFC 3986 in JSON-Strings anzuwenden.
Weil JSON nicht eine Componente von 'application/x-www-form-urlencoded' ist sondern einen eigenen Content-Type darstellt!
PS: Die ++Bewertung Deiner Beiträge sagt mir, dass hier einiges im Argen liegt.