如何使用parson库不借助点方法构造含多层子键的JSON结构
Parson 库非dot方式构造嵌套JSON实现方案
核心实现逻辑
完全不需要使用dot系列API,只需按照「从底层到上层逐层创建对象→填充键值→挂载到父对象对应键」的逻辑即可完成多层级关联,适配固定键名、动态键名的所有场景。
完整可运行示例代码
#include <stdio.h> #include "parson.h" int main() { // 1. 初始化根JSON对象 JSON_Value *root_value = json_value_init_object(); JSON_Object *root_object = json_value_get_object(root_value); // 2. 创建顶层键received_data对应的对象 JSON_Value *received_data_val = json_value_init_object(); JSON_Object *received_data_obj = json_value_get_object(received_data_val); // 3. 创建第一个子对象 X-YY,填充pm值 JSON_Value *xyy_val = json_value_init_object(); JSON_Object *xyy_obj = json_value_get_object(xyy_val); json_object_set_number(xyy_obj, "pm10", 1); json_object_set_number(xyy_obj, "pm25", 2); json_object_set_number(xyy_obj, "pm100", 3); // 将X-YY对象挂载到 received_data 对象下 json_object_set_value(received_data_obj, "X-YY", xyy_val); // 4. 创建第二个子对象 X-ZZ,填充pm值 JSON_Value *xzz_val = json_value_init_object(); JSON_Object *xzz_obj = json_value_get_object(xzz_val); json_object_set_number(xzz_obj, "pm10", 1); // 按需填充其他字段... // 将X-ZZ对象挂载到 received_data 对象下 json_object_set_value(received_data_obj, "X-ZZ", xzz_val); // 5. 将received_data对象挂载到根对象下 json_object_set_value(root_object, "received_data", received_data_val); // 序列化输出验证结果 char *serialized_json = json_serialize_to_string_pretty(root_value); puts(serialized_json); // 释放内存 json_free_serialized_string(serialized_json); json_value_free(root_value); return 0; }
关键说明
json_object_set_value(父对象, 键名, 子值指针)是层级关联的核心API,负责将任意类型的子值(对象、数组、字符串、数值等)绑定到父对象的指定键名下- 你之前使用数组的写法不符合目标结构要求,目标结构里
X-YY/X-ZZ都是对象的键,不是数组元素,直接创建对象挂载即可 - 如果要设置数值类型不要用
json_object_set_string,改用json_object_set_number即可匹配目标结构的数值类型 - 如果
X-YY/X-ZZ这类键名是动态生成的,直接把生成好的键名字符串传入json_object_set_value的第二个参数即可,不需要修改其他逻辑
内容的提问来源于stack exchange,提问作者MartinPolytech
相关产品推荐
相关产品推荐

