


























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
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。