JSON-Parse-Error

Hallo Leute,

stehen mal wieder vor einem Rätsel…

Folgendes Skript wirft einen JSON-Parse-Error:

$Checksum = (0x04 + 0xFF + 0xFF) & 0xFF;
$Message = pack("C*", 0xAA, 0xB4, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, $Checksum, 0xAB);
$this->SendDataToParent(json_encode(Array("DataID"=> "{A0DAAF26-4A2D-4350-963E-CC02E74BD414}", "Function" => "write_bb_bytes_serial", "Baud" => 9600, "Pin_TxD" => $this->ReadPropertyInteger("Pin_TxD"), "Command" => $Message)));

Ich vermute mal, es liegt an der „Message“. Muss da ein decode o.ä. diesen „String“ kapseln?

Joachim

Jup, da fehlt was.
Hinweis aus der PHP-DOKU
’ Alle Strings müssen in UTF-8 kodiert sein’
PHP: json_encode - Manual
Michael

Hallo Michael,

hatte es vorher drin, zunächst auf dem Weg vom Parent zum Child. Hatte mich aber dann gewundert, dass Datensätze ankamen, die ich nicht identifizieren konnte. Google sagte mir, dass es hin und wieder bei einigen Zeichen „Übersetzungsfehler“ gibt, weswegen ich es auf dem Weg Parent Richtung Child entfernte und nun nachvollziehbare Datensätze bekam.

Nun muss ich ja für den Weg Child Richtung Parent ebenfalls eine Zeichenkette erzeugen die sich aus den Hex-Werten ergibt, das könnten eben auch etwas sein was an anderer Stelle als Steuerzeichen oder sonst irgendetwas „ungewöhnliches“ identifiziert wird, in keinem Fall glaube ich jedoch das hier das „UTF-8“ passend ist…

Alternativ könnte ich sicherlich das Array per serialize „packen“ und im Parent entpacken…

Vielleicht ist ja

Doch, das liegt am UTF8.
Json kann nur UTF8 verarbeiten.
Darum brauchst du es in beide Richtungen und auch in allen Funktionen des Datenaustausch.
RawBytes ohne utf8encode und später wieder decode kommen sonst nicht richtig an.
Michael

…habe gerade noch mal geschaut: Bei dem Weg vom Parent zum Child verwende ich „Return“:

$Result = $this->SendDataToParent(j...

, damit kommt das Ergebnis wieder ohne ein SendToChild (im Parent) zurück…:smiley: Deswegen gibt es da wohl keine Probleme.

Bei dem Weg der Anforderung des Child beim Senden muss ich ja manchmal etwas mitgeben, hier werde ich es mal probieren indem ich die Hex-Werte in ein Array packe und im Parent zum senden entpacke…

Joachim

Äh?
Vom Parent zum Child gibt es kein Result.
Du meinst vom Child zum Parent? Das passt dann auch zum Befehl :slight_smile:

Das ist der Rückgabewert aus ForwardData im Parent.
Hier kommt gar kein Json als Rückgabewert, sondern imho immer ein String.
Objekte und RawDaten gehen ebenfalls nicht.
Hier ist serialize imho der einfachste Weg.
Michael

…wahrscheinlich meinen wir dasselbe…

Im Child wird ein $Result = SentToParent… abgesetzt.
Der Wert für $Result kommt dann quasi aus dem Parent ohne explizites „SendToChild“ zurück.
Also quasi Child -> Parent -> Child…:slight_smile:

Funktioniert jedenfalls einwandfrei…

Joachim