JSON 之 SuperObject(11): TSuperTableString、TSuperAvlEntry - 万一 - 博客园
http://www.cnblogs.com/del/archive/2009/10/27/1590501.html
通过 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;
JSON 之 SuperObject(11): TSuperTableString、TSuperAvlEntry的更多相关文章
-
Newtonsoft.Json.4.5.11使用方法总结---反序列化json字符串
写在开头: 最近项目需求,需要在C#中处理json字符串,毫不犹豫的下载了Newtonsoft.Json 4.5.11(2012.12.17)http://json.codeplex.com/,然后百 ...
-
JSON 之 SuperObject(3): 访问
测试数据提前加入 Memo1 中: 代码文件: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, ...
-
JSON 之 SuperObject(8): 关于乱码的几种情况 - 向 Henri Gourvest 大师报告
这几天学习 JSON - SuperObject, 非常幸运地得到了其作者 Henri Gourvest 大师的同步指点! (Henri 大师也是 DSPack 和 GDI+ 头文件的作者; 大师是法 ...
-
JSON 之 SuperObject(6): 方法
SuperObject 的 JSON 对象中还可以包含 "方法", 这太有意思了; 其方法的格式是: procedure Method(const This, Params: IS ...
-
JSON 之 SuperObject(7): 可以省略的双引号
在 JSON 中, 字符串应该在双引号中; 从上个例子才发现: 原来这个双引号可以省略, 有空格都行 当然只是在程序代码中可以省略, 对象会自动识别添加的. 即如此, 下面写法都可以: uses Su ...
-
JSON 之 SuperObject(5): Format 与转义字符
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, For ...
-
JSON 之 SuperObject(2): 构建方式与 AsJSon
SuperObject 构建一个 JSON 的常用方法: 从字符串.从文件.从流. unit Unit1; interface uses Windows, Messages, SysUtils, ...
-
JSON 之 SuperObject(1)
一直盼着 Delphi 能够直接支持 "正则表达式" 与 "JSON"; Delphi 2009 刚来的时候, 有了 JSON, 但不好, 那时尝试过一点. 这 ...
-
JSON 之 SuperObject(10): Merge、Clone、ForcePath
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, For ...
随机推荐
-
php后台编辑关联数据
数据库中两张表: info表中"民族"关联了nation表中的"code". php通过后台编辑info表中民族显示成用户可看懂及可直接修改的选项. 新建xin ...
-
getActionBar().setTitle(); Java.lang.NullPoint异常解决方案
getActionBar().setTitle(); Java.lang.NullPoint异常解决方案,是由于低版本不支持直接获取的缘故,修改方案: try changing your theme ...
-
java代码用dom4j解析xml文件的简单操作
时间: 2016/02/17 目标:为telenor的ALU Femto接口写一个采集xml文件并解析出locationName标签里的值,然后更新到数据库中. 从网上搜了下,有四种常用的解析xml的 ...
-
python 生产者 --- 消费者
值得拿出来 看看的 多进程 爬取 (生产) , 解析 (消费) 网页 同时进行,可以作为以后项目扩展使用 from bs4 import BeautifulSoup import requests i ...
-
mtools-你可能没用过的mongodb神器
前言 接触 mongodb 已经有一段时间了,从一开始的不了解,到现在已慢慢适应这个nosql领域的佼佼者,还是经历了不少波折. 在进行数据库选型的时候,许多人总是喜欢拿 mongodb和mysql. ...
-
Python结合SAP GUI Script操作sap的简易教程
众所周知,如果要用Python做一些桌面WIN32应用的自动化工作,就需要用到著名的pywin32尤其是其中的win32com.client模块,pywin32的安装不能直接通过pip install ...
-
Creed_颓知乎
题目背景 二轮省选前的一个最后周,Creed_还在颓知乎. 突然,她看到一个有趣的回答. 紧接着,Creed_点开了评论区,又看到了一个有趣的评论. Creed_想了一下,发现自己并不会,于是她又顺着 ...
-
c/c++ 标准库 迭代器(iterator)
c/c++ 标准库 迭代器 begin和end运算符返回的具体类型由对象是否是常量决定,如果对象是常量,begin和end返回const_iterator:如果对象不是常量,返回iteraotor 1 ...
-
[jQuery] 通过ajax保存到服务器,成功显示信息.
保存数据到服务器,成功时显示信息. jQuery 代码: $.ajax({ type: "POST", url: "some.php", data: " ...
-
Redis+Sentinel 实现redis集群高可用
1.sentinel作用及实现原理: https://my.oschina.net/u/172871/blog/596976?p={{currentPage-1}}