#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; }