我不明白如何使用 cJSON 将 JSON 文件解析为结构
I don't understand how to use cJSON to parse a JSON file into a 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 对象。我已经阅读了关于 the cJSON github page 的整个文档,但它没有说明如何执行此操作。这是我想要做的一个例子:
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 函数,但所做的只是 modify/return a 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"
}
}
我有一个相当简单的结构 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 对象。我已经阅读了关于 the cJSON github page 的整个文档,但它没有说明如何执行此操作。这是我想要做的一个例子:
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 函数,但所做的只是 modify/return a 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"
}
}