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


    在经过一系列的波折后,还是觉得delphi读取并修改json文件来的方便;

    在网络上找到一个delphi的三方库ISuperObject,添加到项目后直接引用就行;

    下载地址

    ISuperObject中几个常用的函数:

    • 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:UsersadminDesktopF.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;

    注意:

    • 读取文件时如果json文件中包含中文格式,那么在读取时必须保证为获取字段为UTF8String类型。
    •  jRet.O['WindSpeedLine'].A['coordinates'][0].AsArray().add(jo);//对与数组嵌套的json,可以通过这种方式添加。
    • 读取或者声明的jo := SO();不能用clear()清空,否则add(jo)就会成为空数据。

      

  • 相关阅读:
    寒假学习记录19
    寒假学习记录18
    寒假学习记录17
    寒假学习记录16
    寒假学习记录15
    寒假学习记录14
    寒假学习记录13
    寒假学习记录12
    寒假学习记录11
    学习进度(10)
  • 原文地址:https://www.cnblogs.com/motao9527/p/10830725.html
Copyright © 2020-2023  润新知