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

  1. Newtonsoft.Json.4.5.11使用方法总结---反序列化json字符串

    写在开头: 最近项目需求,需要在C#中处理json字符串,毫不犹豫的下载了Newtonsoft.Json 4.5.11(2012.12.17)http://json.codeplex.com/,然后百 ...

  2. JSON 之 SuperObject(3): 访问

    测试数据提前加入 Memo1 中: 代码文件: unit Unit1; interface uses   Windows, Messages, SysUtils, Variants, Classes, ...

  3. JSON 之 SuperObject(8): 关于乱码的几种情况 - 向 Henri Gourvest 大师报告

    这几天学习 JSON - SuperObject, 非常幸运地得到了其作者 Henri Gourvest 大师的同步指点! (Henri 大师也是 DSPack 和 GDI+ 头文件的作者; 大师是法 ...

  4. JSON 之 SuperObject(6): 方法

    SuperObject 的 JSON 对象中还可以包含 "方法", 这太有意思了; 其方法的格式是: procedure Method(const This, Params: IS ...

  5. JSON 之 SuperObject(7): 可以省略的双引号

    在 JSON 中, 字符串应该在双引号中; 从上个例子才发现: 原来这个双引号可以省略, 有空格都行 当然只是在程序代码中可以省略, 对象会自动识别添加的. 即如此, 下面写法都可以: uses Su ...

  6. JSON 之 SuperObject(5): Format 与转义字符

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

  7. JSON 之 SuperObject(2): 构建方式与 AsJSon

    SuperObject 构建一个 JSON 的常用方法: 从字符串.从文件.从流. unit Unit1; interface uses   Windows, Messages, SysUtils, ...

  8. JSON 之 SuperObject(1)

    一直盼着 Delphi 能够直接支持 "正则表达式" 与 "JSON"; Delphi 2009 刚来的时候, 有了 JSON, 但不好, 那时尝试过一点. 这 ...

  9. JSON 之 SuperObject(10): Merge、Clone、ForcePath

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

随机推荐

  1. [LeetCode] 12,13 整数和罗马数互转

    12. 整数转罗马数字 题目链接:https://leetcode-cn.com/problems/integer-to-roman/ 题目描述: 罗马数字包含以下七种字符: I, V, X, L,C ...

  2. 面向对象内置方法之--__str__、__call__、__del__

    __str__: 在对象被打印的时候触发,可以用来定义对象被打印的输出格式 __del__:在对象被删除的时候触发,可以 用来回收对象以外的其他相关资源,比如系统资源等. __call__:在对象呗调 ...

  3. 基于HTML5 的互联网+地铁行业

    前言 近几年,互联网与交通运输的融合,改变了交易模式,影响着运输组织和经营方式,改变了运输主体的市场结构.模糊了运营与非营运的界限,也更好的实现了交通资源的集约共享,同时使得更多依靠外力和企业推动交通 ...

  4. Linux配置外网访问mysql

    stream{    upstream abc{        server 192.168.8.249:3306;    }    server{        listen 9211 ; prox ...

  5. 二分查找c++实现

    二分查找的算法原理较为简单,在此给出c++代码实现,以及代码中遇到的问题,以及解决方案: # include "iostream" using namespace std; //t ...

  6. MySQL备份恢复-mysqldump原理

    +++++++++++++++++++++++++++++++++++++++++++标题:mysqldump对MySQL数据库备份恢复原理时间:2019年2月23日内容:mysqldump工具重点: ...

  7. MySQL的运算符及其优先级

    +++++++++++++++++++++++++++++++++++++++++++标题:MySQL的常见运算符时间:2019年2月23日内容:MySQL的常见运算符重点:主要讲述MySQL常见运算 ...

  8. C#中的虚函数及继承关系

    转载:http://blog.csdn.net/suncherrydream/article/details/8423991 若一个实例方法声明前带有virtual关键字,那么这个方法就是虚方法. 虚 ...

  9. jmeter学习记录--08--第三方测试组件

    我们安装的JMeter版本,功能仍然有欠缺,插件是一种补充,官方提供了很多插件. 官网地址:http://www.jmeter-plugins.org/, 里面有很多可以安装到JMeter的插件,基本 ...

  10. PHP artisan migrate 报错显示 could not find driver ,怎么办?

    记录下自己的错误 一. 1.原因是没有pdo扩展导致的, 2.解决办法:打开php.ini,然后去掉以下两行代码之前的分号(:)即可.如下: extension=php_pdo_firebird.dl ...