文档章节

JSON 之 SuperObject(11): TSuperTableString、TSuperAvlEntry

涂孟超
 涂孟超
发布于 2014/09/26 15:34
字数 542
阅读 10
收藏 0

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

 
 
 
 
 

 

 

  

本文转载自:http://www.cnblogs.com/del/archive/2009/10/27/1590501.html

共有 人打赏支持
涂孟超
粉丝 12
博文 2011
码字总数 14107
作品 0
深圳
程序员
私信 提问
JSon SuperObject 研究2:数据集与JSON对象互转

JSon SuperObject 研究2:数据集与JSON对象互转 JSON不能完全替代XML,但绝对是未来的大势所趋,其优点是简单、体积小、解析更快、解析占用资源更少。在delphi中,数据集是最常用数据存取方式...

vga
2014/12/20
0
1
js中this的总结(转载)

在面向对象编程语言中,对于this关键字我们是非常熟悉的。比如C++、C#和Java等都提供了这个关键字,虽然在开始学习的时候觉得比较难,但只要理解了,用起来是非常方便和意义确定的。JavaScr...

xiaoqiang
2010/05/30
35
0
superobject 序列 数据集 之间转化

superobject 序列数据集 unit uDBJson; interface {$HINTS OFF} usesSysUtils, Classes, Variants, DB, DBClient, SuperObject; typeTTableJSon = class private const const const const co......

vga
2016/08/31
18
0
Json.NET 不再有超过120个依赖项

Json.NET是.NET的官方的JSON解析和序列化库,它取代了Microsoft实际提供的库。但是当把Json.NET推向.NET Standard时,出现了一些问题。除了在该平台上无法使用的众多方法之外,在NET Standar...

dotNET跨平台
2018/03/04
0
0
Swift - SwiftyJSON的使用祥解(附样例,用于JSON数据处理)

Swift - SwiftyJSON的使用祥解(附样例,用于JSON数据处理) 1,SwiftyJSON介绍与配置 SwiftyJSON是个使用Swift语言编写的开源库,可以让我们很方便地处理JSON数据(解析数据、生成数据)。 ...

法斗斗
2016/06/23
30
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring Cloud Greenwich 新特性和F升级分享

2019.01.23 期待已久的Spring Cloud Greenwich 发布了release版本,作为我们团队也第一时间把RC版本替换为release,以下为总结,希望对你使用Spring Cloud Greenwich 有所帮助 Greenwich 只支...

冷冷gg
44分钟前
42
1
精读《论语》读后感作文3600字

精读《论语》读后感作文3600字: 学而篇第一:子曰:“学而时习之,不亦说乎?有朋友自远方来,不亦悦乎?人不知,而不愠,不亦君子乎? 朱熹解:即学而又时时习之,则学者熟,而衷心喜悦,其...

原创小博客
今天
0
0
CPU内存结构

开局一张图 由于CPU频率太快了,为解决直接读取内存的数据上的延迟,在CPU和内存之间,存在3级缓存。 CPU在解决和缓存不一致上采用两种方式: 缓存一致性协议 总线锁机制 CPU CPU的一个时钟周...

春哥大魔王的博客
今天
1
0
记一次centos 7内核升级事故

情景 公司做等保3测评,在进行系统漏洞检测时发现内核存在漏洞,需要进行升级。 名称 版本 升级前内核 CentOS Linux (3.10.0-327.el7.x86_64) 7 (Core) 升级后内核 CentOS Linux (3.10.0-957...

阿dai
今天
9
0
PowerDesigner操作

1.去掉生成DDL里的注释 Database -> Edit Current DBMS -> Script -> Syntax -> BlockComment,去掉BlockComment里面的value内容。...

了凡川
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部