`blobmsg` 类型处理后的 JSON 结构

各种 `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的区别

特殊注意事项

  1. 宏的局限性

    // 宏内不能直接使用循环,需拆解为动态代码:
    blobmsg_add_array(&b, "ports", {
        for (int i = 0; i < 3; i++) { // 错误!宏内不能用循环
            blobmsg_add_u32(&b, NULL, ports[i]);
        }
    });

  2. 内存管理

    // 使用后必须释放缓冲区
    blob_buf_free(&b); 

  3. 错误处理(实际代码中必须添加):

    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]
  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值