Azure IoT SDK C库是否提供JSON消息负载反序列化函数?
嘿,刚好我对Azure IoT SDK for C的这块内容比较熟,来给你唠唠!
Azure IoT SDK for C的JSON反序列化支持
首先肯定你的判断:没错,Azure IoT SDK for C完全提供JSON消息负载的反序列化功能,而且和你看到的DECLARE_MODEL这类模型定义宏是配套的,下面给你两种常用的实现方式,附示例代码:
1. 和模型宏配套的自动生成反序列化函数
你提到的BEGIN_NAMESPACE、DECLARE_MODEL这些宏是SDK的模型驱动序列化/反序列化机制,当你用这些宏定义好数据结构后,SDK会自动生成对应的FromJson反序列化函数(和序列化用的ToJson成对出现)。
举个具体的例子,假设你定义了如下气象站设备的模型:
BEGIN_NAMESPACE(WeatherStation); DECLARE_MODEL(ContosoAnemometer, WITH_DATA(ascii_char_ptr, DeviceId), WITH_DATA(double, WindSpeed), WITH_DATA(int, WindDirection) ); END_NAMESPACE(WeatherStation);
SDK会自动生成WeatherStation_ContosoAnemometer_FromJson函数,你可以在设备方法的回调里直接用它解析JSON负载:
#include "contoso_anemometer_model.h" // 模型宏生成的头文件 void DeviceMethodCallback(const char* methodName, const unsigned char* payload, size_t payloadSize, unsigned char** responsePayload, size_t* responsePayloadSize, void* userContextCallback) { (void)methodName; (void)userContextCallback; // 把JSON负载反序列化为模型实例 WeatherStation_ContosoAnemometer* deviceData = WeatherStation_ContosoAnemometer_FromJson((const char*)payload); if (deviceData != NULL) { // 直接使用解析后的数据 printf("收到的设备ID: %s\n", deviceData->DeviceId); printf("风速: %.2f m/s\n", deviceData->WindSpeed); printf("风向: %d 度\n", deviceData->WindDirection); // 用完记得释放内存,避免泄漏 WeatherStation_ContosoAnemometer_Destroy(deviceData); } // 构造方法响应(这里示例返回空响应) *responsePayload = NULL; *responsePayloadSize = 0; }
注意:这些自动生成的函数依赖SDK的代码生成机制,用CMake构建项目时会自动处理这些宏,生成对应的头文件和源文件。
2. 基础JSON解析器(手动解析)
如果你不需要模型驱动的方式,SDK的azure_c_shared_utility组件提供了轻量的JSON解析工具json_parser.h,可以手动遍历解析JSON内容:
#include "json_parser.h" void DeviceMethodCallback(const char* methodName, const unsigned char* payload, size_t payloadSize, unsigned char** responsePayload, size_t* responsePayloadSize, void* userContextCallback) { (void)methodName; (void)userContextCallback; JSON_PARSER_HANDLE jsonParser = JSON_Parser_Create((const char*)payload); if (jsonParser != NULL) { const char* deviceId; // 解析字符串类型的DeviceId字段 if (JSON_Parser_GetString(jsonParser, "$.DeviceId", &deviceId) == JSON_OK) { printf("设备ID: %s\n", deviceId); } double windSpeed; // 解析浮点类型的WindSpeed字段 if (JSON_Parser_GetDouble(jsonParser, "$.WindSpeed", &windSpeed) == JSON_OK) { printf("风速: %.2f m/s\n", windSpeed); } // 用完销毁解析器 JSON_Parser_Destroy(jsonParser); } // 构造方法响应 *responsePayload = NULL; *responsePayloadSize = 0; }
小提示
你之前看到的序列化示例一般用的是XXX_ToJson函数,对应的反序列化就是XXX_FromJson,这两个是SDK自动成对生成的,只要你用DECLARE_MODEL定义了模型,就可以直接用。建议优先用模型驱动的方式,因为它能帮你自动处理类型转换和内存管理,减少手动解析的出错概率。
内容的提问来源于stack exchange,提问作者SuperCowUser
相关产品推荐
相关产品推荐

