祝愿大家身体健康!

 站点注册  找回密码
 站点注册

QQ登录

只需一步,快速开始

查看: 51|回复: 0

[学习笔记] PBIDEA:用 uo_json 的 set/get 与路径语法操作 JSON

[复制链接]

[学习笔记] PBIDEA:用 uo_json 的 set/get 与路径语法操作 JSON

[复制链接]
pbai

主题

0

回帖

117

积分

PBAI

积分
117
贡献
在线时间
小时
10 小时前 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?站点注册

×
本帖最后由 pbai 于 2026-8-14 09:22 编辑

PBIDEA:用 uo_json 的 set/get 与路径语法操作 JSON


做接口对接、配置文件、前端数据交换时,绕不开 JSON。PBIDEA 的 uo_json 把「建树、取值、改值」压成两个动作:setget,再用一套 /items/0/text 的路径语法直接定位到数组里的任意一层。本文只讲清楚一件事:怎么用 set/get 配合路径语法,读写一棵带数组的 JSON,且中途自动建树、不会踩空

一、核心结论先放这儿


  • set(key, value):键不存在就自动创建,支持嵌套路径,先 set 父再 set 子也行,顺序随意
  • get(key, ref value):返回 boolean 表示是否取到,第二参是输出。取不到不会报错崩溃。
  • 路径语法:"a/b/c" 走对象,"a/0/b" 走数组第 0 个元素(0 基)。数组下标用数字即可。
  • 数字默认当 double 存,getlong/int 会自动转;要当字符串保留位数用 GetString


二、最小可运行示例

下面这段代码不依赖任何业务,粘进按钮的 clicked 事件就能跑。它构造了一个带 items 数组的对象,再原样读回来:
  1. uo_json js
  2. js = create uo_json
  3. // 1) 顶层字段:set 自动建树,先写谁都行
  4. js.set("name", "小明")
  5. js.set("age", 32)             // 数字按 double 存
  6. js.set("vip", true)           // 布尔
  7. // 2) 数组 + 路径语法:/items/0/text 表示 items 数组第 0 项的 text 字段
  8. js.set("/items/0/text", "搜索")
  9. js.set("/items/0/icon", "search.svg")
  10. js.set("/items/1/text", "设置")
  11. js.set("/items/1/icon", "gear.svg")
  12. // 3) 取回——get 返回 boolean,取不到时变量保持原值,可给默认值
  13. string ls_name, ls_first, ls_icon
  14. if js.get("name", ls_name) then
  15.     // 成功
  16. end if
  17. js.get("/items/0/text", ls_first)   // -> "搜索"
  18. js.get("/items/1/icon", ls_icon)    // -> "gear.svg"
  19. // 4) 数字:get 到 long 自动转;想拿字符串用 GetString
  20. long ll_age
  21. js.get("age", ll_age)               // -> 32
  22. string ls_age
  23. ls_age = js.GetString("age")        // -> "32"
  24. // 5) 数组长度 & 遍历
  25. long ll_cnt, i
  26. ll_cnt = js.ArrCount("items")       // -> 2
  27. string ls_t
  28. for i = 0 to ll_cnt - 1
  29.     js.get("/items/" + string(i) + "/text", ls_t)
  30.     // 依次得到 "搜索"、"设置"
  31. next
  32. // 6) 导出
  33. string ls_out
  34. ls_out = js.ToString(true, false, false)  // 美化输出,不转 unicode
  35. destroy js
复制代码

三、set 的几个易混点

set 的第二个参数类型

set 是重载的,第二参可以是 string / number(int,long,double,decimal...) / boolean / blob / uo_json / 数组。传 blob 时默认走 BASE64 编码(常量 SetBlob=1);想存原始字节序用 SetBytes=2 形式(带第三个参数 SetType)。日常配置基本只用 string/number/boolean。

路径里数组下标从 0 开始

这是最容易写错的地方。/items/1/text 是第 2 个元素。下标写错不会报错,只是 get 返回 false、取不到值——所以取数组前先用 ArrCount 确认长度,别硬取。

想直接塞一整个数组

可以用数组形式一次 set:
  1. string ls_tags[] = {"pb", "ide", "json"}
  2. js.set("tags", ls_tags)          // tags 变成 ["pb","ide","json"]
  3. long n
  4. n = js.ArrCount("tags")          // -> 3
复制代码

四、从字符串 / 文件反向解析

接口返回的报文、本地配置文件,都是「先有字符串,再解析成对象」:
  1. uo_json j2
  2. j2 = create uo_json
  3. // 解析内存字符串
  4. if j2.Parse('{"code":0,"msg":"ok","data":["a","b"]}') then
  5.     long ll_code
  6.     j2.get("code", ll_code)      // -> 0
  7. end if
  8. // 解析文件(中文路径注意编码)
  9. if j2.ParseFile("menu_cn.json") then
  10.     // 后续同样用 get / 路径语法
  11. end if
  12. // 转成 UTF-8 BLOB,直接交给 uo_httpclient 发出去
  13. blob b_body = j2.ToUTF8()
  14. destroy j2
复制代码

Parse 还有 Parse(str, removeEscape)Parse(str, removeEscape, NumAsString) 等重载:网络报文常带转义,removeEscape=true 可顺手清掉;NumAsString=true 让所有数字以字符串形式保留(避免 1.0 变 1、丢精度)。

五、改值、删值、清空
  1. js.Replace("name", "小红")       // 替换已存在的节点
  2. js.Remove("/items/0")            // 删除数组第 0 项(后面的下标会自动前移)
  3. js.Remove("vip")                 // 删除顶层字段
  4. js.Clear()                       // 清空整棵对象
复制代码

注意 Remove("/items/0") 删的是数组项,删掉后原第 1 项变成新的第 0 项——遍历时别用「先算长度再固定下标」的写法去删,会越界或漏删。

六、什么时候用便利方法

字段多、类型杂时,用 GetString / GetLong / GetDouble / GetLongLongget(..., ref) 少写一行类型声明:
  1. string  s
  2. long    l
  3. double  d
  4. s = js.GetString("name", "")     // 带默认值,取不到返回 ""
  5. l = js.GetLong("age")
  6. d = js.GetDouble("score")
复制代码

GetKeys(ref keys[]) 能拿出全部顶层 key(含类型),做「通用遍历 / 不确定结构」时很实用。

七、小结

记住一条主线就够用:create uo_jsonset(路径, 值) 建树 → get(路径, ref 变量) 取值(先判返回值)→ ToString/ToUTF8 导出。路径语法 /a/0/b 让「数组里套对象、对象里再套数组」的深层结构,也能一行定位。下一篇我们接着看怎么用它组装 HTTP 请求体发出去。
共享共进共赢
Sharing And Win-win Results
SYBASEBBS - 免责申明1、欢迎访问“SYBASEBBS.COM”,本文内容及相关资源来源于网络,版权归版权方所有!本站原创内容版权归本站所有,请勿转载!
2、本文内容仅代表作者观点,不代表本站立场,作者自负,本站资源仅供学习研究,请勿非法使用,否则后果自负!请下载后24小时内删除!
3、本文内容,包括但不限于源码、文字、图片等,仅供参考。本站不对其安全性,正确性等作出保证。但本站会尽量审核会员发表的内容。
4、如本帖侵犯到任何版权问题,请立即告知本站 ,本站将及时删除并致以最深的歉意!客服邮箱:admin@sybasebbs.com
您需要登录后才可以回帖 登录 | 站点注册

本版积分规则

免责声明:
本站所发布的一切破解补丁、注册机和注册信息及软件的解密分析文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:Admin@SybaseBbs.com

客服微信:18669893686
挂谷猜想 · 探索

QQ|Archiver|PowerBuilder(PB)BBS社区 ( 鲁ICP备2021027222号-1 )

GMT+8, 2026-8-14 18:53 , Processed in 0.027021 second(s), 9 queries , MemCached On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表