如何用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
相关产品推荐
相关产品推荐

