Delphi解析修改Json文件,基於superobject.pas(ISuperObject)

在通過一系列的波折後,仍是以爲delphi讀取並修改json文件來的方便;json

在網絡上找到一個delphi的三方庫ISuperObject,添加到項目後直接引用就行;數組

下載地址網絡

ISuperObject中幾個經常使用的函數:app

  • function SO(const s: SOString = ‘{}’): ISuperObject; overload; 此函數傳入json數據字符串,並返回一個ISuperObject對象,這通常是咱們解析json時使用的第一個函數,如jObj := SO(jsonstr)。
  • property O[const path: SOString]: ISuperObject read GetO write PutO; default; 如:jobj.O[‘username’],此函數被一個ISuperObject對象調用,方括號內的字符串爲json中的字段名稱,返回一個ISuperObject對象。
  • property S[const path: SOString]: SOString read GetS write PutS; 此函數被一個ISuperObject對象調用,和O[‘username’]不一樣的是,它返回的是一個SoString,即一個字符串,使用方法 str := jObj.S[‘username’]; 同理的還有其餘幾個相似的函數,如I[‘age’]返回整數,B[‘isenable’]返回布爾型,A[‘users’]返回一個TSuperArray數組
  • AsString, AsBoolean, AsInteger,AsArray,ISuperObject的函數,用來把ISuperObject轉換成相應的數據類型。

演示代碼:函數

 

//讀取json文件
procedure TForm2.Button1Click(Sender: TObject);
var
  rText: TextFile;
  tmp: UTF8String;
begin
  AssignFile(rText, 'C:\Users\admin\Desktop\F.txt');
  reset(rText);
  while not EOF(rText) do
  begin
    readln(rText, tmp);
    Res := Res + tmp;
  end;
  closefile(rText);
  Memo1.Lines.Add(Res);
  application.MessageBox('加載成功!', '提示', MB_OK);
end;
//處理JSON字符串,按照固定結構讀取
procedure TForm2.Button2Click(Sender: TObject);
var
  jRet, jUsers: ISuperObject;
  aryUsers: TSuperArray;
  gridStartTime, gridEndTime, resultStartTime, resultEndTime, WindSpeedBorder,
    WindDirectBorder: string;
  po, pof, poh, posp: Tpoint;
  num, count, I, J: integer;
  aryers, arrline, arrbar, arrspeed: TSuperArray;
  Tlist: TStringlist;
begin
  jRet:=TSuperObject.Create(stObject);
  Tlist := TStringlist.Create;
  Tlist.Delimiter := ',';
  jRet := SO(Res);
  gridStartTime := jRet.O['gridStartTime'].AsString();
  Memo1.Lines.Add(gridStartTime);
  gridEndTime := jRet.O['gridEndTime'].AsString();
  Memo1.Lines.Add(gridEndTime);
  resultStartTime := jRet.O['resultStartTime'].AsString();
  Memo1.Lines.Add(resultStartTime);
  resultEndTime := jRet.O['resultEndTime'].AsString();
  Memo1.Lines.Add(resultEndTime);
  WindSpeedBorder := jRet.O['WindSpeedBorder'].AsString();
  Memo1.Lines.Add(WindSpeedBorder);
  WindDirectBorder := jRet.O['WindDirectBorder'].AsString();
  Memo1.Lines.Add(WindDirectBorder);

  aryers := jRet.O['WindDirectLine'].O['coordinates'].AsArray();
  count := aryers.Length;
  for I := 0 to count - 1 do
  begin
    arrline := aryers[I].O['mWindDirectBaseLine'].AsArray();
    for J := 0 to arrline.Length - 1 do
    begin
      // Tlist.DelimitedText := arrline[J].O['p'].AsString();
      // po:=point(strtoint(Tlist[0]),strtoint(Tlist[1]));
      Memo1.Lines.Add(arrline[J].O['p'].AsString());
    end;
    arrbar := aryers[I].O['mWindDirectBars'].AsArray();
    for J := 0 to arrbar.Length - 1 do
    begin
      // Tlist.DelimitedText := arrbar[J].O['f'].O['p'].AsString();
      // pof:=point(strtoint(Tlist[0]),strtoint(Tlist[1]));
      // Tlist.DelimitedText := arrbar[J].O['h'].O['p'].AsString();
      // poh:=point(strtoint(Tlist[0]),strtoint(Tlist[1]));
      Memo1.Lines.Add('f: ' + arrbar[J].O['f'].O['p'].AsString()
          + ' h: ' + arrbar[J].O['h'].O['p'].AsString());
    end;
  end;

  aryers := jRet.O['WindSpeedLine'].O['coordinates'].AsArray();
  count := aryers.Length;
  for I := 0 to count - 1 do
  begin
    arrspeed := aryers[I].AsArray();
    for J := 0 to arrspeed.Length - 1 do
    begin
      // Tlist.DelimitedText := arrspeed[J].O['p'].AsString();
      // posp:=point(strtoint(Tlist[0]),strtoint(Tlist[1]));
      Memo1.Lines.Add(arrspeed[J].O['p'].AsString());
    end;
  end;
  application.MessageBox('處理完成!', '提示', MB_OK);
end;
//修改JSON文件並保存
procedure TForm2.Button3Click(Sender: TObject);
var
  jfields, jitems, jo, jRet: ISuperObject;
  date: string;
  num, count, I, J: integer;
  txt:TextFile;
  aryers, arrline, arrbar, arrspeed: TSuperArray;
begin
  jRet := SO(Res);
  if jRet = nil then
       application.MessageBox('讀取失敗!', '提示', MB_OK);
//  date := FormatDateTime('yyyy-MM-dd hh:nn:ss', Now());
  jRet.S['gridStartTime'] := date;
  jRet.S['gridEndTime'] := date;
  jRet.S['resultStartTime'] := date;
  jRet.S['resultEndTime'] := date;
  jRet.S['WindSpeedBorder'] := date;
  jRet.S['WindDirectBorder'] := date;
  jRet.I['gridMethod']:=2;
  count:=jRet.O['WindDirectLine'].A['coordinates'].Length;
  for I := 0 to count - 1 do
  begin
      num:= jRet.O['WindDirectLine'].A['coordinates'][I].A['mWindDirectBaseLine'].Length;
      for J := 0 to num - 1 do
      begin
        jRet.O['WindDirectLine'].A['coordinates'][I].A['mWindDirectBaseLine'][J].S['p']:=inttostr(I)+' ,'+inttostr(J);
      end;
  end;
  Assignfile(txt,'E:\p.gal');  //指定文件路徑
  rewrite(txt);               //建立並打開一個新文件(或覆蓋原有文件)
  Writeln(txt,jRet.AsString());
  Closefile(txt);            //關閉打開的文件

  application.MessageBox(Pchar(jRet.O['gridStartTime'].AsString()), '提示', MB_OK);
end;

注意:spa

  • 讀取文件時若是json文件中包含中文格式,那麼在讀取時必須保證爲獲取字段爲UTF8String類型。
  •  jRet.O['WindSpeedLine'].A['coordinates'][0].AsArray().add(jo);//對與數組嵌套的json,能夠經過這種方式添加。
  • 讀取或者聲明的jo := SO();不能用clear()清空,不然add(jo)就會成爲空數據。
相關文章
相關標籤/搜索