惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

MongoDB | Blog
MongoDB | Blog
大猫的无限游戏
大猫的无限游戏
博客园 - 聂微东
Blog — PlanetScale
Blog — PlanetScale
F
Full Disclosure
雷峰网
雷峰网
T
Tailwind CSS Blog
Hugging Face - Blog
Hugging Face - Blog
D
DataBreaches.Net
量子位
Microsoft Azure Blog
Microsoft Azure Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
V
Vulnerabilities – Threatpost
人人都是产品经理
人人都是产品经理
Security Archives - TechRepublic
Security Archives - TechRepublic
P
Proofpoint News Feed
Help Net Security
Help Net Security
腾讯CDC
I
InfoQ
Know Your Adversary
Know Your Adversary
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
C
Check Point Blog
W
WeLiveSecurity
NISL@THU
NISL@THU
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
N
Netflix TechBlog - Medium
月光博客
月光博客
Schneier on Security
Schneier on Security
Forbes - Security
Forbes - Security
Project Zero
Project Zero
宝玉的分享
宝玉的分享
P
Palo Alto Networks Blog
P
Privacy & Cybersecurity Law Blog
罗磊的独立博客
Latest news
Latest news
Apple Machine Learning Research
Apple Machine Learning Research
V
V2EX
Stack Overflow Blog
Stack Overflow Blog
S
Security Affairs
I
Intezer
爱范儿
爱范儿
Microsoft Security Blog
Microsoft Security Blog
A
Arctic Wolf
有赞技术团队
有赞技术团队
云风的 BLOG
云风的 BLOG
T
Tenable Blog
Hacker News: Ask HN
Hacker News: Ask HN
L
LINUX DO - 最新话题
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More

博客园 - 秋·风

修复aarch64 win64下lazarus不弹出SourceTabPopUpMenu fpc aarch64-win64版编译应用时遇到一个奇怪的bug 在windows 11 on arm64系统编译lazarus出错的处理方法 修复TDBMemo只读不能使用Ctrl+C复制文字的Bug freepascal打补丁后已支持windows 11 on arm64(lazarus aarch64 windows版也可以运行了) 查看libc.so.6的版本号 Lazarus移动版启动程序 fpc 3.2.2交叉编译i386-linux链接出错 lazarus鸿蒙开发13:使用鸿蒙原生API画图--lazarus侧关键代码 lazarus鸿蒙开发12:使用鸿蒙原生API画图--鸿蒙侧关键代码 lazarus鸿蒙开发11:使用鸿蒙原生接口画图 lazarus鸿蒙开发10:lazarus一键编译、打包助手 lazarus鸿蒙开发9:使用命令行编译DevEco Studio应用 lazarus鸿蒙开发8:在DevEco Studio的日志窗口显示日志信息 lazarus鸿蒙开发7:在 Windows 上为 OpenHarmony (LoongArch64) 编译 Qt 5.15.12 SDK 指南 lazarus鸿蒙开发6:鸿蒙project配置 lazarus鸿蒙开发5:编译ohos_hap_project lazarus鸿蒙开发4:编译OHOS_QT_Lazarus lazarus鸿蒙开发3:编译libLazarusOHOS_Wrapper.so lazarus鸿蒙开发2:编译鸿蒙版本Qt5pas lazarus鸿蒙开发1:编译QT 5.12.12 鸿蒙版 fpc/lazarus for x86_64/aarch64鸿蒙版(绿色版 2026.06.03更新) fastreport报表编辑器在aarch64等非x86_64 CPU第一次打开慢的解决方案 linux/windows双系统可用的打包程序 使用FPC自带的纯 Pascal 实现的 Zlib 替代品——paszlib QFLazarus使用说明 忽略lazarus console in/output窗显示的转义序列 编译fpc遇到的怪事(2026-05-20更新) 取消树莓派的系统双击桌面图标时出现弹窗的选择提示 银河麒麟v11安装lazarus的方法 【小技巧】lazarus的应用设置某个form不在任务栏显示(linux) 用lazarus封装了linux的rsync SimpleXML-for-lazarus fastreport在windows11(lazarus)报表设计时出现的问题 用lazarus编写的deb打包工具 龙芯deepin 25系统使用旧世界软件的方法 中文转全拼音和首字母 lazarus扩展IDE宏的方法 调整lazarus gtk2编辑控件背景颜色 fpc/lazarus可用的宏 Lazarus IDE宏列表 【原创控件】PopupMenu和MainMenu自绘单元 【原创控件】PopupMenu自绘 【原创控件】lazarus自定义mainmenu菜单栏(2026-02-26 增加菜单项图标尺寸参数) cudaText存在段落长度超过一定字数时会出现字符重叠的问题 lazarus编写的程序在Ubuntu任务栏/快捷栏不显示设定的图标 lazarus实现拖放文件 在uos使用lazarus调试时遇到的问题 【原创控件】lazarus IDE界面备份和恢复插件(2026-02-07增加恢复默认布局及官方已集成到lazarus) lazarus for arm32编译so链接出错
SimpleJSON for lazarus
秋·风 · 2026-03-25 · via 博客园 - 秋·风

lazarus版基于https://github.com/MufeeSama/SimpleJSON ,使用freepascal的fpjson实现的,使用方法和原版一样,并增加的Flatten 方法,原本需要编写复杂的递归算法才能实现的遍历逻辑,现在只需要简单的循环就能搞定。
lazarus版下载网址:
https://github.com/szlbz/SimpleJSON-for-lazarus
重点讲一下Flatten的使用方法:

procedure TForm1.Button2Click(Sender: TObject);
var
  Json: IJson;
  Items: TJsonFlatItems;
  I: Integer;
begin
  // 1. 构建复杂 JSON
  Json := TJson.Create;
  Json.S['name'] := '张三';
  Json.I['age'] := 30;
  
  // 嵌套对象
  Json.O['address'].S['city'] := '北京';
  Json.O['address'].S['zip'] := '100000';
  
  // 嵌套数组
  Json.A['scores'].Add(95).Add(88);
  
  // 2. 调用 Flatten 获取单层数组
  Items := Json.Flatten;
  
  // 3. 单层循环遍历,无需关心层级结构
  Memo1.Lines.Add('--- 遍历结果 ---');
  for I := 0 to High(Items) do
  begin
    Memo1.Lines.Add(Format('路径: %s, 值: %s', 
      [Items[I].Path, Items[I].Value]));
  end;
end;

输出结果:

{
  "name": "张三",
  "age": 30,
  "address": {
    "city": "北京",
    "zip": "100000"
  },
  "scores": [
    95,
    88
  ]
}
--- 遍历结果 ---
路径: name, 值: 张三
路径: age, 值: 30
路径: address.city, 值: 北京
路径: address.zip, 值: 100000
路径: scores[0], 值: 95
路径: scores[1], 值: 88

进阶用法:筛选或查找
利用这个列表方便地进行数据筛选,比如“找出所有值为数字的节点”:

procedure TForm1.Button3Click(Sender: TObject);
var
  Json: IJson;
  Items: TJsonFlatItems;
  I: Integer;
begin
  // 1. 构建复杂 JSON
  Json := TJson.Create;
  Json.S['name'] := '张三';
  Json.I['age'] := 30;

  // 嵌套对象
  Json.O['address'].S['city'] := '北京';
  Json.O['address'].S['zip'] := '100000';

  // 嵌套数组
  Json.A['scores'].Add(95).Add(88);

  Memo1.Lines.Add(Json.Format);

  Items := Json.Flatten;

  for I := 0 to High(Items) do
  begin
    // 如果值类型是数字
    if Items[I].ValueType = jvtNumber then
    begin
      Memo1.Lines.Add(Format('找到数字: %s = %s',
        [Items[I].Path, Items[I].Value]));
    end;
  end;
end;

输出结果:

Memo1
{
  "name": "张三",
  "age": 30,
  "address": {
    "city": "北京",
    "zip": "100000"
  },
  "scores": [
    95,
    88
  ]
}
找到数字: age = 30
找到数字: scores[0] = 95
找到数字: scores[1] = 88