1

我有一个相当简单的结构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));
}

我尝试使用名称中带有对象的 cJSON 函数,但所做的只是修改/返回 cJSON*。我需要将它从 cJSON 获取到不同的结构中。

谢谢你的帮助。

4

1 回答 1

2

使用对象的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"
  }
}
于 2020-03-24T00:55:36.053 回答