簡體   English   中英

我不明白如何使用 cJSON 將 JSON 文件解析為結構體

[英]I don't understand how to use cJSON to parse a JSON file into a struct

我有一個相當簡單的 struct Message ,其中包含兩個Envelope類型的字段。

struct Envelope
{
    char* Payload; //Byte array of message data
    char* Signature; //Byte array for signature of endorser
};

struct Message
{
    char* configSeq; //Byte array config sequence
    Envelope* configMsg;
    Envelope* normalMsg;
};

一切都歸結為一個字節數組(表示為 char* 因為 C 沒有字節類型)

我只想使用 cJSON 讀取 JSON 文件並將其反序列化為 Message 對象。 我已經閱讀了cJSON github 頁面上的整個文檔,但它沒有說明如何執行此操作。 這是我想要做的一個例子:

char* message = checkForMessage();
if (message) //If a message exists
{
    //Must parse as JSON
    cJSON* json = cJSON_Parse(message);
    Message* msg = //have json convert to Message type
    checkMessage<<<1, 1>>>(msg, time(0));
}

我嘗試使用名稱中帶有 object 的 cJSON 函數,但所有這些都是修改/返回一個 cJSON*。 我需要將它從 cJSON 獲取到不同的結構中。

謝謝你的幫助。

使用cJSON對象的valuestring成員獲取字符串值,然后將它們復制到

cJSON *str;
str = cJSON_GetObjectItemCaseSensitive(json, "configSeq");
msg.configSeq = strdup(str.valuestring);

msg.configMsg = malloc(sizeof(*msg.configMsg));
cJSON *configMsg = cJSON_GetObjectItemCaseSensitive(json, "configMsg");
str = cJSON_GetObjectItemCaseSensitive(configMsg, "Payload");
msg.configMsg->Payload = strdup(str.valuestring);
str = cJSON_GetObjectItemCaseSensitive(configMsg, "Signature");
msg.configMsg->Signature = strdup(str.valuestring);

msg.normalMsg = malloc(sizeof(*msg.normalMsg));
cJSON *normalMsg = cJSON_GetObjectItemCaseSensitive(json, "normalMsg");
str = cJSON_GetObjectItemCaseSensitive(normaMsg, "Payload");
msg.normalMsg->Payload = strdup(str.valuestring);
str = cJSON_GetObjectItemCaseSensitive(normalMsg, "Signature");
msg.normalMsg->Signature = strdup(str.valuestring);

cJSON_Delete(json);

上面的代碼假設消息 JSON 如下所示:

{
  "configSeq": "String",
  "configMsg": {
    "Payload": "String",
    "Signature": "String"
  },
  "normalMsg": {
    "Payload": "String",
    "Signature": "String"
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM