博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
XE3随笔12:TSuperTableString、TSuperAvlEntry
阅读量:5312 次
发布时间:2019-06-14

本文共 2587 字,大约阅读时间需要 8 分钟。

通过 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;

转载于:https://www.cnblogs.com/DaXiong2000/p/4726448.html

你可能感兴趣的文章
2019年7月22日 静态方法
查看>>
题目1012:畅通工程
查看>>
1413确定进制
查看>>
JS组件系列——封装自己的JS组件,你也可以
查看>>
C#进阶系列——DDD领域驱动设计初探(七):Web层的搭建
查看>>
No Launcher activity found!
查看>>
xml序列化派生类
查看>>
Snmp的学习总结(一)
查看>>
MySQL server has gone away报错原因分析
查看>>
突然感觉需要写点什么
查看>>
机器学习 周志华 第1章习题
查看>>
SOAP UI(ReadyAPI)学习——第一步:资源帖
查看>>
oracle 分组查询
查看>>
SQL server 2008 sa 账户设置失败
查看>>
dp小菜数塔
查看>>
assign、retain、copy使用异同
查看>>
算术验证
查看>>
BLE Android开发中的问题
查看>>
关于面试题 的一点看法
查看>>
java项目打jar包
查看>>