I cJson für C, in eine eingebettete Plattform bin mit einer JSON wie diese bauen:cJson wie Länge des Druckpuffers berechnen
{"ProtocolVersion":1,"ID":"123","Zone":"xyz","MessageType":42,"Message":"Json payload MSG #6"}
das ich diese Funktion von cJson bereitgestellt verwenden zu tun:
jsonObject = cJSON_CreateObject();
/* Add Protocol Version */
cJSON_AddNumberToObject(jsonObject, "ProtocolVersion", 1);
/* Add Machine Id */
cJSON_AddStringToObject(jsonObject, "ID", idStr);
/* Add Market */
cJSON_AddStringToObject(jsonObject, "Zone", xyzStr);
/* Add Message Type */
cJSON_AddNumberToObject(jsonObject, "MessageType", typeNum);
/* Add Message */
cJSON_AddStringToObject(jsonObject, "Message", msgStr);
die json erstellen ich die Funktion verwendet:
cJSON_PrintPreallocated(jsonObject, *jsonMessage, *jsonMessageLen, 0);
ich bevorzuge es cJson einen Puffer von meinem applicatio vorbelegt passieren n und ich berechnen die Pufferlänge grundsätzlich durch Summe der Länge jedes Schlüssels und Objekts.
Zum Beispiel: strlen ("Zone") + strlen (xyzStr) + ... + Anzahl der "" + Anzahl der {} + Anzahl, + Anzahl:
Auf diese Weise ich die erhalten genaue Länge meines JSON.
Leider schlägt die Funktion "cJSON_PrintPreallocated" aufgrund einer falschen Pufferlänge (es scheint zu kurz) fehl.
Wenn ich eine zusätzliche 30 Bytes zu meiner "jsonMessage" hinzufügen, funktioniert alles.
Wo liege ich falsch?
Welches ist der beste Weg, die von cJson benötigte Pufferlänge zu berechnen?
Danke!
Denken Sie sorgfältig darüber nach, wie JSON strukturiert ist. Es ist nicht _just_ die Schlüssel und Werte und die verschiedenen Trennzeichen. Öffnen Sie ein Beispiel-JSON-Dokument und schauen Sie sich an, welche anderen Zeichen neben denen in den Schlüsseln und Werten vorhanden sein können. –
Warum ist 'jsonMessageLen' auch ein Zeiger? Wenn dies nicht der Fall ist, müssen Sie Warnungen aktivieren, da Sie versuchen, den Wert bei einem Nicht-Zeiger zu ermitteln. –
Verwenden Sie den Zeiger zu jsonMessageLen, da ich die jsonMessage dynamisch zuweisen. – Federico