在经过一系列的波折后,还是觉得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. CSV数据存取

    CSV数据的读取十分地简单 分为两部分 读 读取csv文件可以使用csv模块下的reader(f)以及DictReader(f) mport csv with open("text.csv& ...

  2. 使用scrapy-redis搭建分布式爬虫环境

    scrapy-redis简介 scrapy-redis是scrapy框架基于redis数据库的组件,用于scrapy项目的分布式开发和部署. 有如下特征:  分布式爬取 您可以启动多个spider工 ...

  3. 4sql

    在 MySQL 中,有三种主要的类型:文本.数字和日期/时间类型. Text 类型:CHAR(size)VARCHAR(size)TINYTEXTTEXT 存放最大长度为 65,535 个字符的字符串 ...

  4. Linux01机和Linux02机的切换 和秘钥的配置

    先试一下 01机和02机是否可以切换成功 使用 ssh root@ip地址 输入密码 ifconfig查看ip是否正确 切换回01机 01机配置的秘钥 查看隐形文件 01机配置秘钥 输入  ssh-c ...

  5. flanneld 安装

    目录 flanneld 安装 下载分发flanneld二进制文件 分发二进制文件到所有集群的节点 创建Flannel证书和私钥 创建证书签名请求 生成证书和私钥 向etcd写入Pod网段信息 创建fl ...

  6. Netty学习——服务器端代码和客户端代码 原理详解

    服务器端代码和客户端代码 原理详解:(用到的API) 0.Socket 连接服务器端的套接字 1.TcompactProtocol   协议层2.TFrameTransport   传输层3.THsh ...

  7. 封装扩展Kendo UI Grid

    封装后的代码如下: function DataGrid(options) { this.options = { height: "100%", sortable: true, re ...

  8. Spring Boot中@ConditionalOnProperty使用详解

    在Spring Boot的自动配置中经常看到@ConditionalOnProperty注解的使用,本篇文章带大家来了解一下该注解的功能. Spring Boot中的使用 在Spring Boot的源 ...

  9. 往Github上,上传本地项目

    1.先申请一个Github的帐号,创建一个仓库. 复制这个仓库的地址: 创建完空仓库,页面下方会有提示代码,告诉怎么操作 在本地的项目下依次执行下面的代码: git init   //在本地创建git ...

  10. 数据挖掘算法(三)--logistic回归

    数据挖掘算法学习笔记汇总 数据挖掘算法(一)–K近邻算法 (KNN) 数据挖掘算法(二)–决策树 数据挖掘算法(三)–logistic回归 在介绍logistic回归之前先复习几个基础知识点,有助于后 ...