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 ...
随机推荐
- JavaScript笔记十一
1.DOM查询 - 通过具体的元素节点来查询 - 元素.getElementsByTagName() - 通过标签名查询当前元素的指定后代元素 - 元素.childNodes - 获取当前元素的所有子 ...
- mybatis精讲(四)--ObjectFactory
目录 前言 mybatis的ObjectFactory 源码 setProperties create instantiateClass 使用场景 # 加入战队 微信公众号 前言 ObjectFact ...
- 了解HTTP协议,这一篇就够了
HTTP(Hyper Text Transfer Protocol:超文本传输协议)是一个基于请求与响应模式的.无状态的.应用层的协议,常基于TCP的连接方式,HTTP1.1版本中给出一种持续连接的 ...
- win到linux的编码问题
从windows到linux的文件可能存在编码问题时,这是因为,Linux和Windows文本文件的行结束标志不同.在Linux中,文本文件用"\n"表示回车换行,而Windows ...
- 设计模式之观察者模式--PHP
列举一个场景:下班之后回家,打开家门,开始做饭,之后睡觉 以上场景如果按照传统的开始方式就是封装一个用户类,里面有回家方法,打开门方法,做饭方法,睡觉方法,之后在外面依次调用. 假设你代码开发完了,这 ...
- 堆的python实现及其应用
堆的概念 优先队列(priority queue)是一种特殊的队列,取出元素的顺序是按照元素的优先权(关键字)大小,而不是进入队列的顺序,堆就是一种优先队列的实现.堆一般是由数组实现的,逻辑上堆可以被 ...
- 品HashMap(java8)
前言 作为java开发人员,HashMap可谓是业务中的一把利器,9龙再次捡起这老生常谈的知识点,深入源码,细细品味. 首先,我们抛出几个关于HashMap的问题,带着问题去学习,就像捉迷藏一样有意思 ...
- luogu P1759 通天之潜水
题目背景 直达通天路·小A历险记第三篇 题目描述 在猴王的帮助下,小A终于走出了这篇荒山,却发现一条波涛汹涌的河拦在了自己的面前.河面上并没有船,但好在小A有n个潜水工具.由于他还要背重重的背包,所以 ...
- 报错 Please make sure you have the correct access rights and the repository exists (git 添加ssh密钥 )
1.设置Git的user name和email $ git config --global user.name "wubaiwan" $ git config --global u ...
- 清理Mac
mac在更新系统以及Xcode时总是报磁盘空间不足.于是下定决心来清理一下. 1.首先点击管理,清理下大文件,以及倾倒垃圾篓. 2.下载mac清理工具,清理一些缓存文件. 3.查看下文件中占用最大的文 ...