欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-03-10 12:45:12
在经过一系列的波折后,还是觉得delphi读取并修改json文件来的方便; 在网络上找到一个delphi的三方库ISuperObject,添加到项目后直接引用就行; 下载地址 ISuperObject中几个常用的函数: function SO(const s: SOString = ‘{}’): I ......

在经过一系列的波折后,还是觉得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:\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;

注意:

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