JSON 의 SuperObject (11): TSuperTabletString, TSuperAvlEntry

3187 단어 String
ISuperObject. AsObject 를 통 해 TSuperTabletString 대상 을 얻 을 수 있 습 니 다.
TSuperTabletString 의 상용 속성: 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 입 니 다. 우 리 는 TSuperTabletString 에서 현재 층 과 모든 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;


 
   

좋은 웹페이지 즐겨찾기