IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> Delphi JSON总结 -> 正文阅读

[大数据]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

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-04-24 09:31:36  更:2022-04-24 09:33:15 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 2:23:55-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码