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

如何用Parson库构建JSON数组?MCU传感器数据上传至服务器问题

用Parson库构建目标JSON结构的实现方案

嘿,我来帮你搞定用Parson构建这个指定JSON结构的问题!Parson作为轻量C JSON库,处理嵌套数组和对象其实挺顺手的,咱们一步步拆解来写,重点解决你困惑的sensors和measurements数组部分。

完整代码示例

#include <stdio.h>
#include "parson.h"

int main() {
    // 1. 初始化根JSON对象
    json_value *root = json_value_init_object();
    if (!root) {
        printf("Failed to create root JSON object\n");
        return -1;
    }

    // 2. 构建systemInfo部分
    json_object_set_value(root, "systemInfo", json_value_init_object());
    json_object *system_info = json_object_get(root, "systemInfo");
    
    // 添加hubId
    json_object_set_string(system_info, "hubId", "1234");
    
    // 构建battery子对象
    json_object_set_value(system_info, "battery", json_value_init_object());
    json_object *battery = json_object_get(system_info, "battery");
    json_object_set_number(battery, "value", 3.3);
    json_object_set_string(battery, "unit", "V");

    // 3. 构建sensors数组(重点部分)
    json_object_set_value(root, "sensors", json_value_init_array());
    json_array *sensors_array = json_array(json_object_get(root, "sensors"));

    // 3.1 添加第一个传感器S1
    json_value *sensor_s1 = json_value_init_object();
    json_object_set_string(json_object(sensor_s1), "name", "S1");
    
    // 构建S1的measurements数组
    json_object_set_value(json_object(sensor_s1), "measurements", json_value_init_array());
    json_array *s1_meas_array = json_array(json_object_get(sensor_s1, "measurements"));
    
    // 添加S1的第一个测量值
    json_value *s1_meas1 = json_value_init_object();
    json_object_set_string(json_object(s1_meas1), "measuredValue", "val");
    json_object_set_number(json_object(s1_meas1), "value", 123);
    json_object_set_string(json_object(s1_meas1), "unit", "unit");
    json_array_append(s1_meas_array, s1_meas1);
    
    // 将S1添加到sensors数组
    json_array_append(sensors_array, sensor_s1);

    // 3.2 添加第二个传感器S2(多测量值)
    json_value *sensor_s2 = json_value_init_object();
    json_object_set_string(json_object(sensor_s2), "name", "S2");
    
    // 构建S2的measurements数组
    json_object_set_value(json_object(sensor_s2), "measurements", json_value_init_array());
    json_array *s2_meas_array = json_array(json_object_get(sensor_s2, "measurements"));
    
    // 添加S2的第一个测量值
    json_value *s2_meas1 = json_value_init_object();
    json_object_set_string(json_object(s2_meas1), "measuredValue", "val1");
    json_object_set_number(json_object(s2_meas1), "value", 123);
    json_object_set_string(json_object(s2_meas1), "unit", "unit1");
    json_array_append(s2_meas_array, s2_meas1);
    
    // 添加S2的第二个测量值
    json_value *s2_meas2 = json_value_init_object();
    json_object_set_string(json_object(s2_meas2), "measuredValue", "val2");
    json_object_set_number(json_object(s2_meas2), "value", 456);
    json_object_set_string(json_object(s2_meas2), "unit", "unit2");
    json_array_append(s2_meas_array, s2_meas2);
    
    // 将S2添加到sensors数组
    json_array_append(sensors_array, sensor_s2);

    // 4. 序列化JSON为字符串(格式化输出)
    const char *json_str = json_serialize_to_string_pretty(root);
    if (json_str) {
        printf("Generated JSON:\n%s\n", json_str);
        // 这里可以将json_str发送到服务器
        json_free_serialized_string(json_str); // 释放序列化后的字符串
    }

    // 5. 释放所有JSON对象内存
    json_value_free(root);

    return 0;
}

关键步骤解释

数组构建核心逻辑

不管是sensors还是measurements数组,都是遵循初始化数组对象 → 创建子元素对象 → 设置子元素属性 → 将子元素添加到数组的流程:

  • 用json_value_init_array()初始化一个空数组
  • 用json_value_init_object()创建数组中的每个元素(每个传感器/测量值都是一个JSON对象)
  • 用json_object_set_*系列函数给对象设置属性(name、measuredValue等)
  • 用json_array_append()将子对象添加到对应的数组中

内存管理注意

  • 只要调用json_value_free(root)就能递归释放所有子对象、数组的内存,不用单独释放每个子元素
  • 序列化生成的字符串需要用json_free_serialized_string()单独释放

输出结果

运行代码后会生成你需要的JSON结构:

{
    "systemInfo": {
        "hubId": "1234",
        "battery": {
            "value": 3.3,
            "unit": "V"
        }
    },
    "sensors": [
        {
            "name": "S1",
            "measurements": [
                {
                    "measuredValue": "val",
                    "value": 123,
                    "unit": "unit"
                }
            ]
        },
        {
            "name": "S2",
            "measurements": [
                {
                    "measuredValue": "val1",
                    "value": 123,
                    "unit": "unit1"
                },
                {
                    "measuredValue": "val2",
                    "value": 456,
                    "unit": "unit2"
                }
            ]
        }
    ]
}

内容的提问来源于stack exchange,提问作者Cristian M

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:44:14