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 ...
随机推荐
- 黄聪:No 'Access-Control-Allow-Origin' header is present on the requested resource解决办法
在.htaccess文件里面添加下面代码: <IfModule mod_headers.c> Header set Access-Control-Allow-Origin "*& ...
- 本地和VMware虚拟主机之间的网络访问
在需要设置的虚拟主机节点上右键,点击[设置...] 在打开的虚拟机设置中,选中[网络适配器],之后在右边设置网络连接为[自定义:指定的虚拟网络] 然后设置同一网关即可.
- OpenGL 学习
一.红宝书学习资料汇集 第八版的图书源码 源代码: http://opengl-redbook.com/Code/oglpg-8th-edition.zip 第九版的图书源码 http://www.o ...
- CSS基本语法
这里主要介绍Bootstrap里用到的CSS语法,以便在源码分析时更容易理解和学习.Bootstrap的CSS组件的核心就是选择器的定义以及在各自优先级上的处理. 优先级 如何确定CSS的优先级,这里 ...
- stdio.h----标准的输入输出函数
C++兼容了stdio.h函数,其用法和c一样. 命令形式 #include <stdio.h>; 1.
- 算法库:boost安装配置
前提是电脑上已经装有VS. 1. 下载boost_1_60_0.zip并解压到所需位置 2. 双击bootstrap.bat生成b2.exe(新版)和bjam.exe(老版) 3. 双击b2.exe或 ...
- Sql语句查看表结构
快速查看表对的就说明,及表字段描述及字段类型 --表描述 SELECT tbs.name 表名,ds.value 描述 FROM sys.extended_properties ds LEFT JOI ...
- XMPP协议错误码
302 重定向 尽管HTTP规定中包含八种不同代码来表示重定向,Jabber只用了其中一个(用来代替所有的重定向错误).不过Jabber代码302是为以后的功能预留的,目前还没有用到 400 坏请求 ...
- 有关RAVE报表 - 大富翁论坛20050419
部分资料来源于RAVE开发人员指南 ravedevguide5 新闻组News.Nevrona.com RAVE的官方主页 www.nevrona.com/rave KeyLife富翁笔记 作者 ...
- java web项目获取各种路径
1.可以在servlet的init方法里 String path = getServletContext().getRealPath("/"); 这将获取web项目的全路径 例如 ...