通过 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的更多相关文章

  1. XE3随笔3:访问

    测试数据提前加入 Memo1 中: { "name": "张三", /* 注释 */ "age": 33, "sex": ...

  2. XE3随笔20:几个和当前路径相关的新函数

    偶然从 SysUtils 里发现了几个路径相关的函数, 以前没见过, 可能是 Delphi XE3 新增的: GetLocaleDirectory(); GetLocaleFile(); Locale ...

  3. XE3随笔21:系统默认语言与系统支持的语言列表

    unit Unit1; interface uses   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, For ...

  4. XE3随笔18:实例 - 解析 Google 关键字搜索排名

    同上例类似, 通过 'http://clients1.google.cn/complete/search?&q=' + "关键字" 可以获取 Google 的关键字搜索排名 ...

  5. XE3随笔19:实例 - 借用 Google 实现全文翻译

    调用 Google 翻译的地址格式: http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&q=" + ...

  6. XE3随笔17:实例 - 模拟 Google 搜索

    本例测试效果图: 代码文件: unit Unit1; interface uses   Windows, Messages, SysUtils, Variants, Classes, Graphics ...

  7. XE3随笔16:将字符串转换成 UTF8 编码的函数

    这种转换一般用于网页地址; 我不知道 Delphi 是不是有现成的函数, 用到了就写了一个. //函数: function ToUTF8Encode(str: string): string; var ...

  8. XE3随笔15:使用 IXMLHTTPRequest 简单获取网页源代码

    unit Unit1; interface uses   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, For ...

  9. XE3随笔15:从XML中解析

    SuperObject 文件包中还有一个 SuperXmlParser 单元, 可以从 XML 中解析出 ISuperObject. SuperXmlParser 只有三个函数: XMLParseSt ...

随机推荐

  1. Tomcat应用中post方式传参数长度限制

    Tomcat应用中post方式传参数长度限制 jsp页面上是没有限制的,但是在tomcat服务器上有限制,Tomcat 默认的post参数的最大大小为2M, 当超过时将会出错,可以配置maxPostS ...

  2. nokogiri如何使用

    直接来个简单的代码实例就明白啦! require 'nokogiri' xml_data=<<XML <library> <NAME><![CDATA[Fav ...

  3. jboss端口说明

    http://blog.csdn.net/yangbobo1992/article/details/8876587 jboss端口修改说明 1. jboss 的端口修改位置总结 Jboss通常占用的端 ...

  4. SQL Server 2012 创建操作员

    数据库可以通知操作员,给操作员发送邮件,就要在SQL Server 的代理中启用数据库邮件,前提是先配置出数据库邮件 右键SQL Server代理,选择属性,按下图设置 保存后,右键操作员,选择新建操 ...

  5. log4j打印mybatis sql语句

    Mybatis默认使用有slf4j 必须加上依赖 <dependency> <groupId>org.slf4j</groupId> <artifactId& ...

  6. asp.net 运行时,"未能映射路径"

    asp.net 站点出现:未能映射路径,解决方案之一:发现原来是iis 应用程序池中设置了.net framework 版本为4.0了,而且VS中站点的版本为2.0引起的. 解决方案是把VS 中的站点 ...

  7. 源码解读—HashTable

    在上一篇学习过HashMap(源码解读—HashMap)之后对hashTable也产生了兴趣,随即便把hashTable的源码看了一下.和hashMap类似,但是也有不同之处. public clas ...

  8. java 学习备忘录(一):jsp项目建立及开发环境的基本配置

    Tomcat与eclipse配置 窗口->显示视图->Server 新建项目 建“动态web项目” 新建jsp文件 新建->其他->Web->jsp file 设置使用“ ...

  9. Linux 组群账户管理

    一.Linux组群账户配置文件 1./etc/group文件 /etc/group文件是用户组群的配置文件,内容包括用户和用户组群,并且能显示出用户是归属哪个用户组群或哪几个用户组群.一个用户可以归属 ...

  10. 【MySQL】MySQL无基础学习和入门大纲

    一.安装 1.yum安装 2.分发包安装 3.配置文件 4.初始化数据库 二.启动 1.service mysqld start默认配置启动 2.mysqld_safe方式加载配置文件启动 3.mys ...