当前位置: 首页 > news >正文

JSON 之 SuperObject(11): TSuperTableString、TSuperAvlEntry

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 := 0 to item.Value.AsArray.Length - 1 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;

相关文章:

  • js中Object.create作用,什么时候用?和new是什么区别
  • 分享Silverlight/Windows8/WPF/WP7/HTML5一周学习导读(5月6日-5月12日)
  • 【289】◀▶ Python I/O 读写文本文件
  • Model to Text工具Acceleo使用教程(三)——一个简单的代码生成模块
  • UVa11426 最大公约数之和(正版)
  • mac os下通过命令行的方式编译c++代码并在xcode里引用
  • 房地产英语 Real estate词汇
  • 根据Forms名找出其所归属的权限组
  • oss web直传
  • dd-wrt达到300Mbps的关键设置
  • 跨域
  • [转载] 考试经验——2011下半年信息系统项目管理师论文52分者谈论文写作经验...
  • 『TensorFlow』TFR数据预处理探究以及框架搭建
  • shell开发基础:准备100万条测试数据在MYSQL中
  • 十个生成模型(GANs)的最佳案例和原理 | 代码+论文
  • 【402天】跃迁之路——程序员高效学习方法论探索系列(实验阶段159-2018.03.14)...
  • create-react-app项目添加less配置
  • ECS应用管理最佳实践
  • Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!
  • LeetCode29.两数相除 JavaScript
  • LeetCode541. Reverse String II -- 按步长反转字符串
  • Node.js 新计划:使用 V8 snapshot 将启动速度提升 8 倍
  • orm2 中文文档 3.1 模型属性
  • 搭建gitbook 和 访问权限认证
  • 个人博客开发系列:评论功能之GitHub账号OAuth授权
  • 老板让我十分钟上手nx-admin
  • 前端_面试
  • (10)STL算法之搜索(二) 二分查找
  • (4)事件处理——(7)简单事件(Simple events)
  • (day6) 319. 灯泡开关
  • (Redis使用系列) SpringBoot 中对应2.0.x版本的Redis配置 一
  • (二)基于wpr_simulation 的Ros机器人运动控制,gazebo仿真
  • (二)正点原子I.MX6ULL u-boot移植
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (附源码)ssm本科教学合格评估管理系统 毕业设计 180916
  • (四)c52学习之旅-流水LED灯
  • (一)kafka实战——kafka源码编译启动
  • (轉貼) 蒼井そら挑戰筋肉擂台 (Misc)
  • ****Linux下Mysql的安装和配置
  • *++p:p先自+,然后*p,最终为3 ++*p:先*p,即arr[0]=1,然后再++,最终为2 *p++:值为arr[0],即1,该语句执行完毕后,p指向arr[1]
  • . NET自动找可写目录
  • ... fatal error LINK1120:1个无法解析的外部命令 的解决办法
  • .NET CORE Aws S3 使用
  • .net core 依赖注入的基本用发
  • .Net CoreRabbitMQ消息存储可靠机制
  • .Net Core缓存组件(MemoryCache)源码解析
  • .NET企业级应用架构设计系列之结尾篇
  • /etc/sudoer文件配置简析
  • @DependsOn:解析 Spring 中的依赖关系之艺术
  • [ Linux 长征路第二篇] 基本指令head,tail,date,cal,find,grep,zip,tar,bc,unname
  • [【JSON2WEB】 13 基于REST2SQL 和 Amis 的 SQL 查询分析器
  • [android] 看博客学习hashCode()和equals()
  • [BZOJ1053][HAOI2007]反素数ant
  • [C#]获取指定文件夹下的所有文件名(递归)
  • [C++]——带你学习类和对象