JSON 之 SuperObject(12): TSuperEnumerator、TSuperAvlIterator、ObjectFindFirst...

經過 ISuperObject.GetEnumerator 可獲取一個 TSuperEnumerator 對象.

TSuperEnumerator 主要有: MoveNext 方法、Current 屬性; 使用舉例:spa


var
  jo: ISuperObject;
  e: TSuperEnumerator;
begin
  jo := SO('{A:1, B:2, C:3, D:[4, 5, {X:6}, {Y:[7,8,{m:9}]}]}');
  e := jo.GetEnumerator;
  while e.MoveNext do
  begin
    ShowMessage(e.Current.AsString);
  end;
  e.Free;
end;

//上面程序其實沒有實用價值, 由於下面一句話就能夠代替上面這些:
var
  jo,i: ISuperObject;
begin
  jo := SO('{A:1, B:2, C:3, D:[4, 5, {X:6}, {Y:[7,8,{m:9}]}]}');
  for i in jo do ShowMessage(i.AsString);
end;


同經過 TSuperEnumerator 枚舉出的只有 Name:Value 中的 Value; 

經過 TSuperAvlIterator 枚舉出的是 TSuperAvlEntry 對象(其包含 Name 和 Value);

獲取 TSuperAvlIterator 方法:
TSuperTableString.GetEnumerator 或者 ISuperObject.AsObject.GetEnumerator.對象


var
  jo: ISuperObject;
  ite: TSuperAvlIterator;
begin
  jo := SO('{A:1, B:2, C:3, D:[4, 5, {X:6}, {Y:7}]}');

  ite := jo.AsObject.GetEnumerator;

  ite.First;
  ShowMessageFmt('%s : %s', [ite.Current.Name, ite.Current.Value.AsString]);

  ite.Next;
  ShowMessageFmt('%s : %s', [ite.Current.Name, ite.Current.Value.AsString]);

  ite.Last;
  ShowMessageFmt('%s : %s', [ite.Current.Name, ite.Current.Value.AsString]);

  ite.Prior;
  ShowMessageFmt('%s : %s', [ite.Current.Name, ite.Current.Value.AsString]);

  ite.Free;
end;


ObjectFindFirst、ObjectFindNext、ObjectFindClose 是 SuperObject 給的另外一種枚舉元素的方式.

它用到了一個結構:it


TSuperObjectIter = record
  key: SOString;
  val: ISuperObject;
  Ite: TSuperAvlIterator;
end;

//應用舉例:
var
  jo: ISuperObject;
  iter: TSuperObjectIter;
begin
  jo := SO('{A:1, B:2, C:3, D:[4, 5, {X:6}, {Y:7}]}');

  if ObjectFindFirst(jo, iter) then
  begin
    repeat
      ShowMessageFmt('%s - %s', [iter.key, iter.val.AsString]);
    until not ObjectFindNext(iter);
  end;
  ObjectFindClose(iter);
end;

//或者:
var
  jo: ISuperObject;
  iter: TSuperObjectIter;
begin
  jo := SO('{A:1, B:2, C:3, D:[4, 5, {X:6}, {Y:7}]}');

  if ObjectFindFirst(jo, iter) then
  begin
    repeat
      ShowMessageFmt('%s - %s', [iter.Ite.Current.Name, iter.Ite.Current.Value.AsString]);
    until not ObjectFindNext(iter);
  end;
  ObjectFindClose(iter);
end;
相關文章
相關標籤/搜索