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:\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)的更多相关文章
- Cocos2dx&Lua - UI显示优化之怎样解决解析大量json文件
GUIReader中有个widgetFromJsonFile的方法,此方法是用于解析json文件(cocostudio生成的UI的)并返回该文件的父节点(Widget),然后便于进一步的UI操作(如获 ...
- 教程-delphi的开源json库:superobject,用法简介
困惑一天的问题 一个语句搞定了... 回头细说. superobject中的{$DEFINE UNICODE} 就是它,这是json官方推荐的Delphi处理json的包,地址: http://www ...
- IIS7.5支持解析读取.json文件数据
在站点中添加 MIME类型去支持Json文件的解析 添加mime类型 文件扩展名:.json MIME类型:application/json 添加成功后即可. 如果不能直接操作iis也可以直接在web ...
- 编辑修改json文件(PSCustomObject)
#$uname:用户 #$mails:需要绑定或删除的邮箱,如有多个邮箱,中间以,为分隔符,无需添加引号 #######################脚本开始#################### ...
- Golang修改json文件的两种方法
第三方包 go get -u github.com/tidwall/sjson bytes, _ := ioutil.ReadFile(jsonFile) value1, _ := sjson.Set ...
- 修改json文件
第三方库jq https://stedolan.github.io/jq/manual/ cat old_deploy.json \ | jq --arg cpu_limit $cpu_limit ' ...
- C#修改json文件中的某些值
using Newtonsoft.Json; JsonSerializer serialiser = new JsonSerializer(); string newContent = string. ...
- 如何用DELPHI编程修改外部EXE文件的版本信
右击里面有修改 点开直接修改就可以了吧. DELPHI 里程序的版本信息怎么是灰色的,无法更改 耐心读以下说明,应该能解决你的问题,如果不能解决,请Hi我~ 如何给自己的dll文件添加版本信息呢? 首 ...
- Java解析JSON文件的方法(一)
一.首先需要在Eclipse工程中导入相关的jar包,jar包参见链接:http://yunpan.alibaba-inc.com/share/link/NdA5b6IFK 二.提供一份待解析的jso ...
随机推荐
- no matches for kind "Deployment" in version "extensions/v1beta1"
0x00 Problem [root@k8sm90 demo]# kubectl create -f tomcat-deployment.yaml error: unable to recognize ...
- python接口自动化测试——简单的文件上传代码实现,人人网登陆后上传图片举例
import requests '''人人网登陆,图片上传 '''def loginData(): '''登录请求参数''' data = { 'email': '13484545195', 'ico ...
- Java 理论与实践: 处理 InterruptedException【转】
这样的情景您也许并不陌生:您在编写一个测试程序,程序需要暂停一段时间,于是调用Thread.sleep().但是编译器或 IDE 报错说没有处理检查到的InterruptedException.Int ...
- Linux安装python环境脚本
自动安装python环境的脚本 1.首先判断是不是root用户 2.判断是否安装 3.是否下载成功(网络可能有问题) 4.是否解压成功(文件下载可能缺少) 5.安装配置python环境 # codin ...
- 2019-2020-9 20199317 《Linux内核原理与分析》第九周作业
第8章 进程的切换和系统的一般执行过程 1 进程调度的时机 1.1 硬终端与软中断 进程调度的时机都与中断相关,中断有很多种,都是程序执行过程中的强制性转移,转移到操作系统内核相应的处理程序.中 ...
- F#周报2019年第49期
新闻 宣告.NET Core 3.1 新书:Kevin Avignon的F#提升效率 .NET Core 2.2将在2019年12月23日迎来终结 Visual Studio 16.5预览版1中升级了 ...
- 华为云·寻找黑马程序员#海量数据的分页怎么破?【华为云技术分享】
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/devcloud/article/detai ...
- 关于软件定义IT基础设施的未来,深信服是这么思考的
在今年的深信服创新大会上,软件定义IT基础设施成为非常重要的议题之一,深信服与2,000余位客户的CIO和合作伙伴一起围绕IT基础设施在数字化时代中的作用与价值进行了深入的探讨. 此外,深信服还联合I ...
- activate-power-mode,让你在Python编码中,感受炫酷的书写特效!
Atom Atom 是github专门为程序员推出的一个跨平台文本编辑器,具有简洁和直观的图形用户界面,并有很多有趣的特点:支持CSS,HTML,JavaScript等网页编程语言.说到这里大家以为我 ...
- 转:spring aop 拦截业务方法,实现权限控制
难点:aop类是普通的java类,session是无法注入的,那么在有状态的系统中如何获取用户相关信息呢,session是必经之路啊,获取session就变的很重要.思索很久没有办法,后来在网上看到了 ...