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

推荐订阅源

云风的 BLOG
云风的 BLOG
Security Archives - TechRepublic
Security Archives - TechRepublic
V
Vulnerabilities – Threatpost
C
CXSECURITY Database RSS Feed - CXSecurity.com
P
Proofpoint News Feed
G
GRAHAM CLULEY
P
Privacy International News Feed
The Hacker News
The Hacker News
Forbes - Security
Forbes - Security
U
Unit 42
N
News and Events Feed by Topic
D
Darknet – Hacking Tools, Hacker News & Cyber Security
C
Cyber Attacks, Cyber Crime and Cyber Security
C
Cisco Blogs
A
About on SuperTechFans
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
D
Docker
I
Intezer
Spread Privacy
Spread Privacy
The Last Watchdog
The Last Watchdog
V2EX - 技术
V2EX - 技术
S
Security @ Cisco Blogs
F
Full Disclosure
S
Secure Thoughts
M
MIT News - Artificial intelligence
Microsoft Security Blog
Microsoft Security Blog
G
Google Developers Blog
aimingoo的专栏
aimingoo的专栏
W
WeLiveSecurity
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Project Zero
Project Zero
Recorded Future
Recorded Future
Cyberwarzone
Cyberwarzone
S
Security Affairs
AWS News Blog
AWS News Blog
H
Help Net Security
The GitHub Blog
The GitHub Blog
Hacker News: Ask HN
Hacker News: Ask HN
Vercel News
Vercel News
P
Proofpoint News Feed
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
The Register - Security
The Register - Security
S
Schneier on Security
F
Fortinet All Blogs
C
CERT Recently Published Vulnerability Notes
L
LINUX DO - 最新话题
T
Tor Project blog
T
The Exploit Database - CXSecurity.com
MongoDB | Blog
MongoDB | Blog
Webroot Blog
Webroot Blog

博客园 - 秋·风

【aarch64-win64】DonAlfredo终于修复fpc将TSmallPoint赋值为一个负数,并将TSmallPoint赋值给TPoint时得到一个655xx的数值的bug lazarus编译时提示链接出错的处理方法 mORMot2两个BUG 【aarch64-win64】发现fpc aarch64-win64 将TSmallPoint赋值为一个负数,并赋值给TPoint时得到一个655xx的数值的bug 修复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