Delphi JSON总结
Delphi 解析JSON的方法,就我已知的,有三种:
1. Qjson
2. SuperObject
3. System.JSON (Delphi XE 自带)
为方便看效果, 使用Delphi 2007演示Qjson和SuperObject的使用,使用Delphi XE 10.1Berlin演示System.JSON的使用。
1. Delphi 2007使用Qjson(uses Qjson)和SuperObjec(uses superobject)生成JSON和解析JSON
界面如下:
选择ISuperObject(节点顺序有点无法把控),生成如下JSON:
{"msg":"Success","datas":[{"age":10,"id":1,"name":"测试1"},{"age":10,"id":2,"name":"测试2"},{"age":10,"id":3,"name":"测试3"},{"age":10,"id":4,"name":"测试4"},{"age":10,"id":5,"name":"测试5"}],"time":"2020-12-03 11:18:08","code":0,"check":true}
选择Qjson,生成如下JSON:
{
"code":0,
"msg":"Success",
"check":true,
"datas":[
{
"id":1,
"name":"测试1",
"age":10
},
{
"id":2,
"name":"测试2",
"age":10
},
{
"id":3,
"name":"测试3",
"age":10
},
{
"id":4,
"name":"测试4",
"age":10
},
{
"id":5,
"name":"测试5",
"age":10
}
],
"time":"2020-12-03 11:19:08"
}
可以采用Qjson解析,也可以选择ISuperObject解析:
窗体代码如下:
unit uFrmMain;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, superobject, qjson;
const
fmt= '{"id": %d, "name": "测试%d", "age": %d}';
icount= 5;
type
TForm1 = class(TForm)
Button1: TButton;
GroupBox1: TGroupBox;
RadioButton1: TRadioButton;
RadioButton2: TRadioButton;
Button2: TButton;
Memo1: TMemo;
Button3: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure RadioButton2Click(Sender: TObject);
procedure RadioButton1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
FType: Integer;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
json: ISuperObject;
jsonArr: TSuperArray;
js, jsArr: TQJson;
I: Integer;
begin
Memo1.Lines.Clear;
case FType of
0: begin
json:= SO();
json.S['time']:= FormatDateTime('yyyy-MM-dd hh:mm:ss', Now);
json.B['check']:= True;
json['datas']:= SA([]);
for I := 1 to icount do
json.A['datas'].Add(SO(format(fmt, [I, I, 10])));
json.S['msg']:= 'Success';
json.I['code']:= 0;
Memo1.Lines.Text:= json.AsString;
end;
1: begin
js:= TQJson.Create;
try
js.AddVariant('code', 0); //等价于 js.Add('code').AsInteger:= 0;
js.AddVariant('msg', 'Success'); //等价于 js.Add('msg').AsString:= 'Success';
js.AddVariant('check', True); //等价于 js.Add('check').AsBoolean:= True;
jsArr:= js.AddArray('datas');
for I := 1 to icount do
begin
/// <summary>添加一个数组</summary>
/// <param name="AName">要添加的对象的结点名称</param>
/// <param name="AItems">要添加的数组内容</param>
/// <returns>返回创建的结点实例</returns>
jsArr.Add('', format(fmt, [I, I, 10]));
end;
js.AddVariant('time', FormatDateTime('yyyy-MM-dd hh:mm:ss', Now));
Memo1.Lines.Text:= js.AsString;
finally
FreeAndNil(js);
end;
end;
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
json: ISuperObject;
jsonArr: TSuperArray;
js, jsArr: TQjson;
I: Integer;
sJson: string;
lst: TStringList;
begin
sJson:= Memo1.Lines.Text;
case FType of
0: begin
json:= SO(sJson);
if json= nil then
Exit;
lst:= TStringList.Create;
try
lst.Add(Format('%u', [json.I['code']]));
if json.B['check'] then
lst.Add('True')
else
lst.Add('False');
lst.Add(json.S['msg']);
jsonArr:= json.O['datas'].AsArray;
for I := 0 to jsonArr.Length - 1 do
lst.Add(Format('%u %s %u', [jsonArr.O[I].I['id'], jsonArr.O[I].S['name'], jsonArr.O[I].I['age']]));
lst.Add(json.S['time']);
showmessage(lst.text);
finally
FreeAndNil(lst);
end;
end;
1: begin
js:= TQJson.Create;
lst:= TStringList.Create;
try
js.Parse(sJson);
lst.Add(Format('%d', [js.IntByName('code', -1)]));
if js.BoolByName('check', false) then
lst.Add('True')
else
lst.Add('False');
lst.Add(js.ValueByName('msg', ''));
jsArr:= js.ItemByName('datas');
for I := 0 to jsArr.Count - 1 do
lst.Add(Format('%u %s %u', [jsArr.Items[I].IntByName('id', 0)
, jsArr.Items[I].ValueByName('name', '')
, jsArr.Items[I].IntByName('age', 0)]));
lst.Add(js.ValueByName('time', ''));
ShowMessage(lst.Text);
finally
FreeAndNil(js);
FreeAndNil(lst);
end;
end;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
FType:= 0;
end;
procedure TForm1.RadioButton1Click(Sender: TObject);
begin
FType:= 1;
end;
procedure TForm1.RadioButton2Click(Sender: TObject);
begin
FType:= 0;
end;
end.
2. Delphi XE 10.1 Berlin 使用TJSONObject(uses System.JSON)生成JSON和解析JSON
界面如下:
生成如下JSON:
{"code":0,"msg":"Success","check":true,"datas":["{\"id\":1,\"name\":\"测试1\",\"age\":10}","{\"id\":2,\"name\":\"测试2\",\"age\":10}","{\"id\":3,\"name\":\"测试3\",\"age\":10}","{\"id\":4,\"name\":\"测试4\",\"age\":10}","{\"id\":5,\"name\":\"测试5\",\"age\":10}"],"time":"2020-12-03 11:26:12"}
解析效果:
窗体代码如下:
unit uFrmMain;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, System.JSON;
const
fmt= '{"id":%d,"name":"测试%d","age":%d}';
icount= 5;
type
TForm1 = class(TForm)
Button1: TButton;
GroupBox1: TGroupBox;
RadioButton2: TRadioButton;
Button2: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
js: TJSONObject;
jsArr: TJSONArray;
I: Integer;
begin
Memo1.Lines.Clear;
js:= TJSONObject.Create;
jsArr:= TJSONArray.Create;
try
js.AddPair('code', TJSONNumber.Create(0)); //TJSONNumber支持Double、Integer、Int64
js.AddPair('msg', 'Success'); //默认字符
js.AddPair('check', TJSONTrue.Create); //boolean类型 TJSONTrue TJSONFalse
for I := 1 to icount do
jsArr.Add(format(fmt, [I, I, 10]));
js.AddPair('datas', jsArr);
js.AddPair('time', FormatDateTime('yyyy-MM-dd hh:mm:ss', Now));
Memo1.Lines.Add(js.ToString);
finally
js:= nil;
jsArr:= nil;
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
js, jsItem: TJSONObject;
jsArr: TJSONArray;
item: TJSONValue;
I: Integer;
sJson: string;
lst: TStringList;
begin
sJson:= Memo1.Lines.Text;
if sJson= '' then
Exit;
lst:= TStringList.Create;
try
js:= (TJSONObject.ParseJSONValue(TEncoding.UTF8.GetBytes(sJson), 0)) as TJSONObject;
lst.Add(js.GetValue('code').Value);
lst.Add(js.GetValue('msg').Value);
if js.GetValue('check') is TJSONTrue then
lst.Add('True')
else
lst.Add('False');
jsArr:= js.GetValue('datas') as TJSONArray;
for I := 0 to jsArr.Size- 1 do
begin
//jsArr.Get(I) as TJSONObject 竟然报错Invalid class typecast 不知道什么原因
jsItem:= (TJSONObject.ParseJSONValue(TEncoding.UTF8.GetBytes(jsArr.Get(I).Value), 0)) as TJSONObject;
lst.Add(Format('%d %s %d', [
(jsItem.GetValue('id') as TJSONNumber).AsInt,
jsItem.GetValue('name').Value,
(jsItem.GetValue('age') as TJSONNumber).AsInt]));
end;
lst.Add(js.GetValue('time').Value);
ShowMessage(lst.Text);
finally
FreeAndNil(lst);
end;
end;
end.
————————————————
版权声明:本文为CSDN博主「ceaningking」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/ceaningking/article/details/110522777
Delphi JSON总结相关推荐
- delphi json
在delphi中,数据集是最常用数据存取方式.因此,必须建立JSON与TDataSet之间的互转关系,实现数据之间通讯与转换.值得注意的是,这只是普通的TDataset与JSON之间转换,由于CDS包 ...
- delphi JSON用法
1.引用:uses TJSONObject; 1 json := TJSONObject.create; 2 json.addPair('姓名','张三'); 3 json.addPair('年龄', ...
- 【delphi】 JSON 操作详解(TJSONObject)
Delphi官方提供的对于JSON操作的单元是:system.JSON,delphi将JSON元素都定义为对象,注意是对象,既然是对象就需要创建,需要释放.具体如下: 本文演示 Demo 下载:SZH ...
- delphi和python比较_Python For Delphi---更好地协同
先上相关资源的下载吧: python4delphi: 主页: http://code.google.com/p/python4delphi/ 下载: svn checkout http://pytho ...
- delphi 解析json java_Delphi处理JSON格式数据
1 下载/安装组件uLkJSON.pas 2 下载/安装组件strprocess.pas uses SuperObject,uLkJSON,strprocess; //POST JSON数据格式的请求 ...
- Delphi中JSon SuperObject 使用:数据集与JSON对象互转
在delphi中,数据集是最常用数据存取方式.因此,必须建立JSON与TDataSet之间的互转关系,实现数据之间通讯与转换.值得注意的是,这只是普通的TDataset与JSON之间转换,由于CDS包 ...
- Delphi语言最好的JSON代码库 mORMot学习笔记1
mORMot没有控件安装,直接添加到lib路径, 工程中直接添加syncommons,syndb等到uses里 -------------------------------------------- ...
- delphi 实体类 JSON 数组
delphi 实体类 与JSON转换,序列化 TJson REST.JSON.pas System.JSON.Serializers, TJson.JsonToObject TJson.ObjectT ...
- JSON与Delphi Object的互换
JSON与Delphi Object的互换 转载于:https://www.cnblogs.com/LittleTiger/p/7020329.html
- delphi解析json(解决乱码问题)
delphi解析json(解决乱码问题) 参考文章: (1)delphi解析json(解决乱码问题) (2)https://www.cnblogs.com/figofifa/p/6612901.htm ...
最新文章
- postgresql导入mysql的备份_PostgreSQL数据备份、导入转
- DB2数据库常用工具
- 《Ext详解与实践》节选:文件上传
- 学习deercao的正则笔记
- 各企业正在纷纷向“云”,背后有着哪些原因?
- maven的java web项目启动找不到Spring ContextLoaderListener的解决办法
- VC----SDK下对窗口非客户区的操作
- SVD在推荐系统中的应用
- python千行代码项目_p2:千行代码入门python
- 英雄多少钱steam_Steam农历新年特卖:越来越火热的中国单机游戏市场 | 游戏干线...
- intellij idea参数提示param hints
- 找出数列中个数大于总数一半的元素(编程之美2.3)
- 面试美团,面试官突然问我 Java “锁” ,我哭了
- USB转TTL、USB转串口、USB转RS232的区别
- pdf书籍笔记助手,BookxNote使用记录
- SylixOS移植Redis库总结
- 百度音乐高调改名后 掉队的千千音乐还有机会吗?
- thymeleaf渲染搜索页面(template: “class path resource [templates/serach.html]“)-serach2021-09-23
- 跟谁学 英语口语20090927疑问句
- 有了繁难字库生僻字不用造(一)
热门文章
- 局域网互传文件工具_win10一键共享工具免费版(快速解决局域网文件共享问题)官方版...
- STM32+MFRC522完成IC卡号读取、密码修改、数据读写
- Kali Linux镜像安装(1)
- python解释器的下载与安装
- 菜鸟教程java在线编辑器_HTML 编辑器
- 服务器dump文件位置,dump解析入门-用VS解析dump文件进行排障
- iphone长截图哪个软件好_看完长知识了!苹果手机也能截长图,原来iPhone截屏还能这样玩...
- 记录下我磕磕碰碰的三个月找工作经历,BAT大厂面试总结
- VISIO画立体图——VISIO画图技巧
- 8、Python车牌数据集自动生成及其图片叠加