2017-03-17 128 views
1

我使用cJson爲C,到嵌入​​式平臺,打造這樣一個JSON的長度:cJson如何計算打印緩衝區

{"ProtocolVersion":1,"ID":"123","Zone":"xyz","MessageType":42,"Message":"Json payload MSG #6"} 

要做到這一點我用cJson提供了這個功能:

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); 

要創建我利用的功能的JSON:

cJSON_PrintPreallocated(jsonObject, *jsonMessage, *jsonMessageLen, 0); 

我寧願傳給cJson我的應用A預分配的緩衝區n和我基本上通過總和每個Key和Object的長度來計算緩衝區長度。

例如:strlen的( 「區」)+的strlen(xyzStr)+ ... +的 「」 +數量的{}數+數量,+的數量:

這樣我獲得我的JSON的確切長度。

不幸的是,函數「cJSON_PrintPreallocated」由於不正確的緩衝區長度(它似乎很短)而失敗。

如果我添加一個額外的30字節到我的「jsonMessage」一切正常。

我在哪裏錯了?

哪個是計算cJson所需緩衝區長度的最佳方法?

謝謝!

+0

仔細思考如何構建JSON。它不是_just_鍵和值,以及各種分隔符。打開示例JSON文檔,查看除鍵和值以外的其他字符可以在哪裏。 –

+0

另外,爲什麼'jsonMessageLen'是一個指針?如果不是,則需要打開警告,因爲您試圖將該值作爲非指針。 –

+0

使用使用指向jsonMessageLen的指針,因爲我動態分配jsonMessage。 – Federico

回答

1

打印數字時,cJSON保守地在輸出緩衝區中保留64個字節,因爲它無法確定sprintf打印數字的時間。如果數字爲1,這可能意味着cJSON請求的字節數比實際需要的多63字節。

這可能會在cJSON的未來版本中發生變化,但現在有了解決方法。

爲了安全起見,您應該始終使您的緩衝區比您期望的要長63個字節。

UPDATE:

這已被更新。由於版本1.4.6只需要5個額外的字節。

+0

感謝您的回覆。我將這個字節數加在安全的一邊。 – Federico

+0

我還將該信息添加到未來的cJSON.h頭文件中。 – FSMaxB