XE3随笔12:TSuperTableString、TSuperAvlEntry
通过 ISuperObject.AsObject 可获取一个 TSuperTableString 对象.
TSuperTableString 的常用属性: count、GetNames、GetValues
var
jo: ISuperObject;
jts: TSuperTableString;
begin
jo := SO('{A:1, B:2, C:3, D:{x:4, y:5, z:6}}'); jts := jo.AsObject;
ShowMessage(IntToStr(jts.count)); // 4
ShowMessage(jts.GetNames.AsString); // ["D","C","B","A"]
ShowMessage(jts.GetValues.AsString); // [{"z":6,"y":5,"x":4},3,2,1] jts := jo['D'].AsObject;
ShowMessage(IntToStr(jts.count)); // 3
ShowMessage(jts.GetNames.AsString); // ["z","y","x"]
ShowMessage(jts.GetValues.AsString); // [6,5,4]
end;
JSON 本质就是一个二叉树(SuperObject 支持 32 层深度, 足够了);
二叉树的每个节点主要表示一个 Name:Value; 其中的 Name 是字符串, Value 可能是个字符串、整数、数组或另一个 ISuperObject, 所以 Value 的类型只能是 ISuperObject.
描述这个节点的类是 TSuperAvlEntry, 我们可以从一个 TSuperTableString 中枚举出当前层及的每个 TSuperAvlEntry.
var
jo, io: ISuperObject;
item: TSuperAvlEntry;
begin
jo := SO('{A:1, B:2, C:3, D:{x:4, y:5, z:6}}'); {从 TSuperTableString(这里是用 jo.AsObject 获取)中枚举 TSuperAvlEntry}
Memo1.Clear;
for item in jo.AsObject do
Memo1.Lines.Add(Format('Name: %s; Value: %s', [item.Name, item.Value.AsString])); {直接从 ISuperObject 中枚举 "子ISuperObject"}
Memo1.Lines.Add(EmptyStr);
for io in jo do
Memo1.Lines.Add(Format('Value: %s', [io.AsString]));
end;
上面的遍历都没有深入下去, 要彻底深入地遍历需要写回调函数.
下面写了两个回调函数, 第一个没有考虑数组中的对象:
uses SuperObject; //使用回调的遍历过程之一: 没考虑数组中的对象
procedure Proc1(jo: ISuperObject; var List: TStrings);
var
item: TSuperAvlEntry;
begin
for item in jo.AsObject do
if item.Value.DataType = stObject then
Proc1(item.Value, List) {如果是对象就回调}
else {不是对象就添加到列表}
List.Add(Format('%s : %s', [item.Name, item.Value.AsString]));
end; //使用回调的遍历过程之二:
procedure Proc2(jo: ISuperObject; var List: TStrings);
var
i: Integer;
item: TSuperAvlEntry;
begin
for item in jo.AsObject do
begin
if item.Value.DataType = stObject then
Proc2(item.Value, List) {如果是对象就回调}
else begin {不是对象就添加到列表}
List.Add(Format('%s : %s', [item.Name, item.Value.AsString]));
if item.Value.DataType = stArray then begin {如果是数组, 看看里面是不是有对象}
for i := to item.Value.AsArray.Length - do
if item.Value.AsArray[i].DataType = stObject then
Proc2(item.Value.AsArray[i], List); {如果是对象就再回调}
end;
end;
end;
end; //调用测试
procedure TForm1.Button1Click(Sender: TObject);
var
jo: ISuperObject;
List: TStrings;
begin
jo := SO('{A:1, B:2, C:3, D:[4, 5, {X:6}, {Y:[7,8,{m:9}]}]}'); List := TStringList.Create;
Proc1(jo, List);
ShowMessage(List.Text); List.Clear;
Proc2(jo, List);
ShowMessage(List.Text); List.Free;
end;
XE3随笔12:TSuperTableString、TSuperAvlEntry的更多相关文章
- XE3随笔3:访问
测试数据提前加入 Memo1 中: { "name": "张三", /* 注释 */ "age": 33, "sex": ...
- XE3随笔20:几个和当前路径相关的新函数
偶然从 SysUtils 里发现了几个路径相关的函数, 以前没见过, 可能是 Delphi XE3 新增的: GetLocaleDirectory(); GetLocaleFile(); Locale ...
- XE3随笔21:系统默认语言与系统支持的语言列表
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, For ...
- XE3随笔18:实例 - 解析 Google 关键字搜索排名
同上例类似, 通过 'http://clients1.google.cn/complete/search?&q=' + "关键字" 可以获取 Google 的关键字搜索排名 ...
- XE3随笔19:实例 - 借用 Google 实现全文翻译
调用 Google 翻译的地址格式: http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&q=" + ...
- XE3随笔17:实例 - 模拟 Google 搜索
本例测试效果图: 代码文件: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics ...
- XE3随笔16:将字符串转换成 UTF8 编码的函数
这种转换一般用于网页地址; 我不知道 Delphi 是不是有现成的函数, 用到了就写了一个. //函数: function ToUTF8Encode(str: string): string; var ...
- XE3随笔15:使用 IXMLHTTPRequest 简单获取网页源代码
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, For ...
- XE3随笔15:从XML中解析
SuperObject 文件包中还有一个 SuperXmlParser 单元, 可以从 XML 中解析出 ISuperObject. SuperXmlParser 只有三个函数: XMLParseSt ...
随机推荐
- canvas draw a image
var c = context.getContext("2d"); var cimg = new Image(); cimg.src = "img path"; ...
- javascript内建对象
内建对象等价于内建构造器内建对象大致分为三类:数据封装类对象--Object.Array.Boolean.Number和String工具类对象--Math.Date.RegExp等用于提供遍历的对象错 ...
- PHP中去除字符串中的换行的方法
在PHP中,有时候我们需要对字符串的换行进行过滤,比如天涯PHP博客中文章页面的description信息,我是直接截取的文章内容,并过滤掉html符号,最终还要过滤掉其中的换行.下面整理一下常见的去 ...
- work flow
- Spark SQL External Data Sources JDBC简易实现
在spark1.2版本中最令我期待的功能是External Data Sources,通过该API可以直接将External Data Sources注册成一个临时表,该表可以和已经存在的表等通过sq ...
- POJ1364 King-差分
Description Once, in one kingdom, there was a queen and that queen was expecting a baby. The queen p ...
- javascript 函数执行上下文
在js里,每个函数都有一个执行的上下文,我们可以通过this来访问. 如: 全局函数 function test(){ var local = this; } 我们发现local等于window(do ...
- nginx环境下配置nagiosQL-关于nagiosql配置文件
接上文:nginx环境下配置nagios-关于nginx.conf nagiosql文件应该处于conf/domain/目录下 nagiosql配置如下: ; gzi ...
- VC MFC在CMFCToolBar工具栏中加入组合框
如何在CMFCToolBar工具栏中加入组合框等控件,且先看在线MSDN上怎么说的: 要增加一个组合框,需要完成以下步骤: 1.在工具栏资源中,增加一个对应ID资源号的按钮. 2.在主框架(mainf ...
- java-web乱码问题解决
<一>乱码问题(设置tomcat uriencoding=’utf-8’); 统一设置编码过滤器 <1>get请求: request.setCharacterEncoding( ...