2017-03-17 2 views
1

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!

+0

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. –

+0

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. –

+0

Verwenden Sie den Zeiger zu jsonMessageLen, da ich die jsonMessage dynamisch zuweisen. – Federico

Antwort

1

Beim Drucken von Zahlen reserviert cJSON konservativ 64 Bytes im Ausgabepuffer, weil es nicht sicher wissen kann, wie lange ein Sprintf eine Zahl drucken wird. Im Fall der Nummer 1 kann dies bedeuten, dass cJSON 63 Bytes mehr anfordert, als es tatsächlich benötigt.

Dies wird sich wahrscheinlich in einer zukünftigen Version von cJSON ändern, aber für den Moment gibt es jetzt einen neuen Weg.

Um sicher zu sein, sollten Sie Ihren Puffer immer 63 Bytes länger als das, was Sie erwarten, machen.

UPDATE:

Dieser wurde aktualisiert. Seit Version 1.4.6 werden nur 5 zusätzliche Bytes benötigt.

+0

Danke für die Antwort. Ich füge diese Anzahl von Bytes hinzu, um auf der sicheren Seite zu sein. – Federico

+0

Ich fügte diese Information auch der cJSON.h-Header-Datei für die Zukunft hinzu. – FSMaxB