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