Invalides JSON in REST API für /cdr/live seit pascom 19.18

Mir wurde bereits Samstag von meinen Kollegen gemeldet, dass die Live-Ansicht in unserem CRM nicht mehr funktioniert. Mittlerweile weiß ich, dass es daran liegt, dass das JSON, welches die Abfrage “/cdr/live” zurückgibt kein valides JSON mehr ist, da es mehrere root Elemente hat. Es ist nicht mehr möglich diesen Inhalt mit json_decode in ein PHP Array umzuwandeln. Der JSON-Validator online bestätigt mir meinen Verdacht und gibt “INVALID (RFC 8259)” wieder. Ich arbeite nun einem Workaround, ich würde mich aber freuen, wenn ihr dies fixen könntet.

JSON Formatter & Validator (curiousconcept.com)

@tweber

Update: Wenn es mehr als einen Anruf gibt, dann wird nicht ein JSON Objekt gebildet, sondern zwei, welche einfach aneinander gekettet werden. Dadurch ist das JSON invalide. Den Fehler kann mit folgender Code-Zeile beheben:

        $rawJsonResponse = str_replace('}][{', '},{', $rawJsonResponse);

Und genau hier ist das Problem. Anstelle von “[{call-record},{call-record}]”, gibt die API das hier zurück: “[{call-record}][{call-record}]”.

Update 2: Das Problem ist, dass die Live-Gespräche 2x zurückgegeben werden! Sprich, der JSON-Response wird einfach nochmal an den JSON-Response angehängt und ist deswegen invalide. Das ist mir beim Debuggen aufgefallen, wenn ein einziges Gespräch verwendet wird. Dieses ist dann doppelt in der Gesprächsliste.

Hallo @hazington,

das Problem ist, genau wie du es beschrieben hast, nachzustellen. Das JSON Array wird einfach zwei Mal in die Antwort geschrieben.

Idee für einen relativ simplen workaround:

$half = (int) ( (strlen($response) / 2) ); // strlen($reponse) should never be odd, but just to make sure
$left = substr($response, 0, $half);
echo $left

Achtung: Der workaround funktioniert nach einem fix nicht mehr.

Ich nehme bei uns ein Ticket auf. Eine der nächsten Versionen wird das dann wieder besser machen.

Danke für’s Melden!

Danke, dass ihr das Problem bestätigt habe. Ich habe einen weiteren Workaround anzubieten, der auch nach einem Fix funktionieren sollte, da nicht zu erwarten ist, dass innerhalb der Daten ein “}][{” vorkommt. Man könnte aber auch bei deiner Lösung einfach prüfen, ob json_decode NULL zurück gibt und wenn ja, den String halbieren. Wichtig ist hier einfach nur, dass man vorab prüft, ob man die JSON Zeichenkette in ein Array konvertieren kann.

$responseBody = // raw JSON string            

if ($responseBody === '[][]') {
    return [];
}
        
$jsonArray = json_decode($responseBody, true);

// Fix for invalid JSON response of the pascom API
if ($jsonArray === null) {
    $splitToken = '____EWESO____';
    $responseBody = str_replace('}][{', '}]' . $splitToken, $responseBody);
    $parts = explode($splitToken, $responseBody);
    $jsonArray = json_decode($parts[0], true);
}

return $jsonArray;