52 lines
1.6 KiB
C++
52 lines
1.6 KiB
C++
#include "protocol.h"
|
|
#include "cJSON.h"
|
|
|
|
cJSON* protocol_message_to_json(const ProtocolMessage* msg) {
|
|
cJSON* root = cJSON_CreateObject();
|
|
|
|
cJSON_AddNumberToObject(root, "v", msg->v);
|
|
cJSON_AddStringToObject(root, "id", msg->id.c_str());
|
|
cJSON_AddStringToObject(root, "type", msg->type.c_str());
|
|
cJSON_AddNumberToObject(root, "ts", msg->ts);
|
|
cJSON_AddStringToObject(root, "deviceId", msg->deviceId.c_str());
|
|
|
|
cJSON* payload_obj = nullptr;
|
|
if (msg->payload) {
|
|
payload_obj = cJSON_Duplicate(msg->payload, 1); // deep copy
|
|
} else {
|
|
payload_obj = cJSON_CreateObject();
|
|
}
|
|
cJSON_AddItemToObject(root, "payload", payload_obj);
|
|
|
|
return root;
|
|
}
|
|
|
|
ProtocolMessage protocol_message_from_json(const cJSON* root) {
|
|
ProtocolMessage msg;
|
|
|
|
const cJSON* item = nullptr;
|
|
|
|
item = cJSON_GetObjectItem(root, "v");
|
|
if (item && cJSON_IsNumber(item)) msg.v = item->valueint;
|
|
|
|
item = cJSON_GetObjectItem(root, "id");
|
|
if (item && cJSON_IsString(item)) msg.id = item->valuestring;
|
|
|
|
item = cJSON_GetObjectItem(root, "type");
|
|
if (item && cJSON_IsString(item)) msg.type = item->valuestring;
|
|
|
|
item = cJSON_GetObjectItem(root, "ts");
|
|
if (item && cJSON_IsNumber(item)) msg.ts = item->valuedouble; // uint64_t
|
|
|
|
item = cJSON_GetObjectItem(root, "deviceId");
|
|
if (item && cJSON_IsString(item)) msg.deviceId = item->valuestring;
|
|
|
|
item = cJSON_GetObjectItem(root, "payload");
|
|
if (item && cJSON_IsObject(item)) {
|
|
msg.payload = cJSON_Duplicate(item, 1); // deep copy
|
|
} else {
|
|
msg.payload = cJSON_CreateObject();
|
|
}
|
|
|
|
return msg;
|
|
} |