在经过一系列的波折后,还是觉得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. mysql安装与sqlyog安装

    首先是mysql安装,参考下面两个链接 https://www.cnblogs.com/gengyufei/p/11735358.html#_label4 https://www.jb51.net/a ...

  2. Liunx 安装配置zsh和oh-my-zsh 替换 bash

    一.前言 本文将基于 Liunx 环境安装配置zsh 和 oh-my-zsh 替换 bash oh my zsh Liunx默认shell是单调的bash,而zsh比较高大上,bash有的功能,zsh ...

  3. 选择了uniapp开发app

    7月份打算做一简单app,之前公司做app的时候简单用过Dcloud公司的mui,当时由于uniapp刚出来,最终选择了mui.对uniapp的 了解几乎没有. 做app对我来说几乎是零基础的,当然是 ...

  4. HTML字符实体(Character Entities)与 转义字符串(Escape Sequence)(转)

    为什么要用转义字符串?HTML中<,>,&等有特殊含义(<,>,用于链接签,&用于转义),不能直接使用.这些符号是不显示在我们最终看到的网页里的,那如果我们希望 ...

  5. Selenium+Java(三)Selenium元素定位

    前言 使用Selenium做元素定位的时候,需要用到HTML的知识,所以最好是能懂得HTML的基本知识. 一.页面元素的查看(以百度为例) 打开IE浏览器,点击F12进入开发者模式,点击图中红圈圈中的 ...

  6. Spring Boot2 系列教程(二十八)Spring Boot 整合 Session 共享

    这篇文章是松哥的原创,但是在第一次发布的时候,忘了标记原创,结果被好多号转发,导致我后来整理的时候自己没法标记原创了.写了几百篇原创技术干货了,有一两篇忘记标记原创进而造成的一点点小小损失也能接受,不 ...

  7. Vue引入

    Vue引入 概念: 1.el:实例 new Vue({ el: '#app' }) // 实例与页面挂载点一一对应 // 一个页面中可以出现多个实例对应多个挂载点 // 实例只操作挂载点内部内容 2. ...

  8. auto_modify_ip Shell脚本安装

    #!/bin/bash # : #This author is DKS #auto modify ip of linux ############################### IP_NAME ...

  9. 腾讯视频缓存 tdl 转 mp4

    找到腾讯视频->设置,看下缓存文件的目录地址,然后cmd,通过命令进行转化.  copy/b *.tdl 1.mp4

  10. 第三章 学习Shader所需的数学基础(5)

    1. Unity Shader的内置变量(数学篇) 使用Unity写shader的一个好处在于,它提供了很多内置参数,这使得我们不在需要自己手动算一些值.本文给出Unity内置的用于空间变换和摄像机以 ...