各种 `blobmsg` 类型处理后的 JSON 结构。
1. 基本类型 处理结果
```json
{
"string": "value",
"number": 42,
"boolean": true
}
📝 *对应代码*:
c
blobmsg_add_string(&b, "string", "value");
blobmsg_add_u32(&b, "number", 42);
blobmsg_add_bool(&b, "boolean", true);
2. 数组 处理结果
简单数组
json
{
"numbers": [1, 2, 3]
}
📝 *对应代码*:
c
void *arr = blobmsg_open_array(&b, "numbers");
blobmsg_add_u32(&b, NULL, 1);
blobmsg_add_u32(&b, NULL, 2);
blobmsg_add_u32(&b, NULL, 3);
blobmsg_close_array(&b, arr);
混合类型数组
json
{
"mixed": ["text", true, 42]
}
3. 嵌套对象 处理结果
json
{
"device": {
"name": "router",
"network": {
"ip": "192.168.1.1",
"dns": ["8.8.8.8", "8.8.4.4"]
}
}
}
📝 *对应代码*:
c
void *tbl = blobmsg_open_table(&b, "device");
blobmsg_add_string(&b, "name", "router");
void *net_tbl = blobmsg_open_table(&b, "network");
blobmsg_add_string(&b, "ip", "192.168.1.1");
void *dns_arr = blobmsg_open_array(&b, "dns");
blobmsg_add_string(&b, NULL, "8.8.8.8");
blobmsg_add_string(&b, NULL, "8.8.4.4");
blobmsg_close_array(&b, dns_arr);
blobmsg_close_table(&b, net_tbl);
blobmsg_close_table(&b, tbl);
4. 动态结构 处理结果
```json
{
"action": "update",
"items": [
{"name": "item1", "value": 100},
{"name": "item2", "value": 200}
],
"status": {
"code": 200,
"message": "OK"
}
}
C代码
#include <libubox/blobmsg.h>
struct blob_buf b;
// 初始化缓冲区
blob_buf_init(&b, 0);
// 添加基本字段
blobmsg_add_string(&b, "action", "update");
// 动态添加数组(items)
void *items_array = blobmsg_open_array(&b, "items");
for (int i = 0; i < 2; i++) {
void *item = blobmsg_open_table(&b, NULL); // 数组元素用NULL作为名称
blobmsg_add_string(&b, "name", (i == 0) ? "item1" : "item2");
blobmsg_add_u32(&b, "value", (i == 0) ? 100 : 200);
blobmsg_close_table(&b, item);
}
blobmsg_close_array(&b, items_array);
// 添加嵌套对象(status)
void *status_table = blobmsg_open_table(&b, "status");
blobmsg_add_u32(&b, "code", 200);
blobmsg_add_string(&b, "message", "OK");
blobmsg_close_table(&b, status_table);
// 最终生成的JSON(通过blobmsg_format_json()可输出)
5. **宏简化结构** 处理结果
json
{
"config": {
"hostname": "myrouter",
"network": {
"ip": "192.168.1.1",
"dns": ["8.8.8.8", "1.1.1.1"]
},
"ports": [80, 443, 22]
}
}
C代码
#include <libubox/blobmsg_json.h> // 需要此头文件支持宏
struct blob_buf b;
blob_buf_init(&b, 0);
// 使用 BLOBMSG_PARSE 宏简化嵌套结构
blobmsg_add_table(&b, "config", {
blobmsg_add_string(&b, "hostname", "myrouter"),
blobmsg_add_table(&b, "network", {
blobmsg_add_string(&b, "ip", "192.168.1.1"),
blobmsg_add_array(&b, "dns", {
blobmsg_add_string(&b, NULL, "8.8.8.8"),
blobmsg_add_string(&b, NULL, "1.1.1.1"),
}),
}),
blobmsg_add_array(&b, "ports", {
blobmsg_add_u32(&b, NULL, 80),
blobmsg_add_u32(&b, NULL, 443),
blobmsg_add_u32(&b, NULL, 22),
}),
});
// 验证生成的JSON(实际使用时需错误检查)
char *json = blobmsg_format_json_indent(&b, true, 0);
printf("%s\n", json);
free(json);
4.和5的区别
特殊注意事项
-
宏的局限性:
// 宏内不能直接使用循环,需拆解为动态代码: blobmsg_add_array(&b, "ports", { for (int i = 0; i < 3; i++) { // 错误!宏内不能用循环 blobmsg_add_u32(&b, NULL, ports[i]); } });
-
内存管理:
// 使用后必须释放缓冲区 blob_buf_free(&b);
-
错误处理(实际代码中必须添加):
if (!blobmsg_add_string(&b, "key", "value")) { fprintf(stderr, "Failed to add string\n"); }
1. 树状图:适合展示嵌套结构
root
├─ string: "value"
├─ device
│ ├─ name: "router"
│ └─ network
│ ├─ ip: "192.168.1.1"
│ └─ dns: ["8.8.8.8", "8.8.4.4"]
└─ numbers: [1, 2, 3]
2. 表格对比:
3. 流程图(用于动态构建):
[初始化 blob_buf]
↓
[添加基本字段]
↓
[打开数组/表] → [添加元素] → [关闭数组/表]
↓
[生成最终 JSON/blob]