Delphi SuperObject json操作类的基本用法

发布时间 2023-04-02 22:45:09作者: 软件吴

Delphi SuperObject json操作类的基本用法

 Delphi2009中开始提供了json支持,但并不完善,提供的单元为(Delphi 2009-Delphi XE4 为DBXJson,很不好用,当时据说是为Datasnap开发准备,方法功能不完善,缺少比如XE5以上版本(System.json)中所提供的GetValue等方法。所以经过各种测试json官方提供的几个单元,比如ljkjson等。最终发现还是SuperObject最好用。简单整理一下使用方法:
  (*
  ISuperObject中几个常用的函数:
   
  * 此函数传入json数据字符串,并返回一个ISuperObject对象,
  * 这一般是我们解析json时使用的第一个函数,如jObj := SO(jsonstr)。
  function SO(const s: SOString = '{}'): ISuperObject; overload;
   
   
  * 方括号内的字符串为json中的字段名称,返回一个ISuperObject对象。如:jobj.O['username'],
  property O[const path: SOString]: ISuperObject read GetO write PutO; default;
   
  * 和O['username']不同的是,它返回的是一个SoString,
  * 即一个字符串,使用方法 str := jObj.S['username'];
  * 同理的还有其他几个类似的函数,如I['age']返回整数,B['isenable']返回布尔型,A['users']返回一个TSuperArray数组
  property S[const path: SOString]: SOString read GetS write PutS;
   
  * ISuperObject的函数,用来把ISuperObject转换成相应的数据类型。
  AsString, AsBoolean, AsInteger,AsArray,
   
  *)
  var
  jo, jf: ISuperObject;
  ja: TSuperArray;
  s,sColName,sValue: string;
   
   
   
   
  //------------------------------
  //取某节点下字段列表
  jo := SO(AJson); //载入JSON字符串
  //ja:= jo['DATA'].AsArray; //取某节点下所有数据并序列化
  ja:= jo.A['DATA']; //跟上面的效果一样
  ja:=SO(AJson).AsArray; //无节点json字符串序列化
  jf := ja.O[0]; //取DATA节点下第一条记录
  ColList:=TStringList.Create;
  for i := to jf.AsObject.count - do
  begin
  ColList.Add(jf.AsObject.GetNames.AsArray[i].AsString ); //逐一取DATA节点下jf下的字段名
  //jf.AsObject.GetValues.AsArray[i].AsString; //逐一取DATA节点下jf下的字段值
  end;
   
  showmessage(ColList.Text);
   
  返回字段值:
  CpnID
  ShortName
  FullName
   
  showmessage(jf.AsString);
   
  返回值:
  {"FullName":"宝沪国际(A)貿易有限公司","ShortName":"宝沪国际-A","CpnID":"BHA"}
   
  //----------------------------------------------------
  sColName :=jf.AsObject.GetNames.AsString;
  showmessage(sColName);
   
  返回值:
  ["FullName","ShortName","CpnID"]
  //----------------------------------------------------
  sValue:=jf.AsObject.GetValues.AsString ;
  showmessage(sValue);
   
  返回值:
  ["宝沪国际(A)貿易有限公司","宝沪国际-A","BHA"]
   
  //----------------------------------------------------
  jf.AsObject.GetValues.AsArray[k].AsString; //取DATA节点下的字段值

节点循环取值示例:

  procedure TForm1.Button7Click(Sender: TObject);
  var
  jo: ISuperObject;
  i: integer;
  begin
  jo := SO('{"A":1, B:2, C:3, D:4,E:5,F:6}');
  Memo2.Clear;
  for i := jo.AsObject.count - downto do
  begin
  Memo2.Lines.Add(jo.AsObject.GetNames.AsArray[i].AsString + ':' + jo.AsObject.GetValues.AsArray[i].AsString);
  end;
  Memo2.Lines.Add(jo.S['E']); //取E的值 5
   
  for i := jo.AsObject.count - downto do
  begin
  Memo2.Lines.Add(jo.AsObject.GetNames.AsArray[i].AsString );
  end;
  //Memo2.Lines.Add(jo.S['E']); //取E的值 5
   
   
  end;

执行结果: