You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:46:08