Я не понимаю, как использовать cJSON для анализа файла JSON в структуре - PullRequest
0 голосов
/ 24 марта 2020

У меня довольно простая структура 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 и десериализации его в объект сообщения. Я прочитал всю документацию на странице 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));
}

Я пытался использовать функции cJSON с объектом в их имени, но все, что они делают, это изменяют / возвращают c JSON*. Мне нужно получить его из cJSON в другую структуру.

Спасибо за любую помощь.

1 Ответ

1 голос
/ 24 марта 2020

Используйте элемент valuestring объекта cJSON для получения строковых значений, а затем просто скопируйте их в

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"
  }
}
...