在经过一系列的波折后,还是觉得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 := to count - do
begin
arrline := aryers[I].O['mWindDirectBaseLine'].AsArray();
for J := to arrline.Length - 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 := to arrbar.Length - 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 := to count - do
begin
arrspeed := aryers[I].AsArray();
for J := to arrspeed.Length - 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']:=;
count:=jRet.O['WindDirectLine'].A['coordinates'].Length;
for I := to count - do
begin
num:= jRet.O['WindDirectLine'].A['coordinates'][I].A['mWindDirectBaseLine'].Length;
for J := to num - 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)就会成为空数据。

  

Delphi解析修改Json文件,基于superobject.pas(ISuperObject)的更多相关文章

  1. Cocos2dx&Lua - UI显示优化之怎样解决解析大量json文件

    GUIReader中有个widgetFromJsonFile的方法,此方法是用于解析json文件(cocostudio生成的UI的)并返回该文件的父节点(Widget),然后便于进一步的UI操作(如获 ...

  2. 教程-delphi的开源json库:superobject,用法简介

    困惑一天的问题 一个语句搞定了... 回头细说. superobject中的{$DEFINE UNICODE} 就是它,这是json官方推荐的Delphi处理json的包,地址: http://www ...

  3. IIS7.5支持解析读取.json文件数据

    在站点中添加 MIME类型去支持Json文件的解析 添加mime类型 文件扩展名:.json MIME类型:application/json 添加成功后即可. 如果不能直接操作iis也可以直接在web ...

  4. 编辑修改json文件(PSCustomObject)

    #$uname:用户 #$mails:需要绑定或删除的邮箱,如有多个邮箱,中间以,为分隔符,无需添加引号 #######################脚本开始#################### ...

  5. Golang修改json文件的两种方法

    第三方包 go get -u github.com/tidwall/sjson bytes, _ := ioutil.ReadFile(jsonFile) value1, _ := sjson.Set ...

  6. 修改json文件

    第三方库jq https://stedolan.github.io/jq/manual/ cat old_deploy.json \ | jq --arg cpu_limit $cpu_limit ' ...

  7. C#修改json文件中的某些值

    using Newtonsoft.Json; JsonSerializer serialiser = new JsonSerializer(); string newContent = string. ...

  8. 如何用DELPHI编程修改外部EXE文件的版本信

    右击里面有修改 点开直接修改就可以了吧. DELPHI 里程序的版本信息怎么是灰色的,无法更改 耐心读以下说明,应该能解决你的问题,如果不能解决,请Hi我~ 如何给自己的dll文件添加版本信息呢? 首 ...

  9. Java解析JSON文件的方法(一)

    一.首先需要在Eclipse工程中导入相关的jar包,jar包参见链接:http://yunpan.alibaba-inc.com/share/link/NdA5b6IFK 二.提供一份待解析的jso ...

随机推荐

  1. no matches for kind "Deployment" in version "extensions/v1beta1"

    0x00 Problem [root@k8sm90 demo]# kubectl create -f tomcat-deployment.yaml error: unable to recognize ...

  2. python接口自动化测试——简单的文件上传代码实现,人人网登陆后上传图片举例

    import requests '''人人网登陆,图片上传 '''def loginData(): '''登录请求参数''' data = { 'email': '13484545195', 'ico ...

  3. Java 理论与实践: 处理 InterruptedException【转】

    这样的情景您也许并不陌生:您在编写一个测试程序,程序需要暂停一段时间,于是调用Thread.sleep().但是编译器或 IDE 报错说没有处理检查到的InterruptedException.Int ...

  4. Linux安装python环境脚本

    自动安装python环境的脚本 1.首先判断是不是root用户 2.判断是否安装 3.是否下载成功(网络可能有问题) 4.是否解压成功(文件下载可能缺少) 5.安装配置python环境 # codin ...

  5. 2019-2020-9 20199317 《Linux内核原理与分析》第九周作业

    第8章  进程的切换和系统的一般执行过程 1  进程调度的时机 1.1  硬终端与软中断 进程调度的时机都与中断相关,中断有很多种,都是程序执行过程中的强制性转移,转移到操作系统内核相应的处理程序.中 ...

  6. F#周报2019年第49期

    新闻 宣告.NET Core 3.1 新书:Kevin Avignon的F#提升效率 .NET Core 2.2将在2019年12月23日迎来终结 Visual Studio 16.5预览版1中升级了 ...

  7. 华为云·寻找黑马程序员#海量数据的分页怎么破?【华为云技术分享】

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/devcloud/article/detai ...

  8. 关于软件定义IT基础设施的未来,深信服是这么思考的

    在今年的深信服创新大会上,软件定义IT基础设施成为非常重要的议题之一,深信服与2,000余位客户的CIO和合作伙伴一起围绕IT基础设施在数字化时代中的作用与价值进行了深入的探讨. 此外,深信服还联合I ...

  9. activate-power-mode,让你在Python编码中,感受炫酷的书写特效!

    Atom Atom 是github专门为程序员推出的一个跨平台文本编辑器,具有简洁和直观的图形用户界面,并有很多有趣的特点:支持CSS,HTML,JavaScript等网页编程语言.说到这里大家以为我 ...

  10. 转:spring aop 拦截业务方法,实现权限控制

    难点:aop类是普通的java类,session是无法注入的,那么在有状态的系统中如何获取用户相关信息呢,session是必经之路啊,获取session就变的很重要.思索很久没有办法,后来在网上看到了 ...