大家好,我们继续 Delphi 从入门到实战系列。
前面我们学了:基础入门、记事本、数据库、串口、软件美化、网络请求、打包、异常与多线程。
而现在几乎所有接口、APP、后台通信,全都用JSON。
如果你想做:对接 API、爬虫、登录、数据上传、小程序 / 网站交互,必须会 JSON。
这篇我用最简单、最实用、不绕弯的方式,教你 Delphi 原生操作 JSON,不用任何第三方控件,直接复制就能用。
一、Delphi 用哪个单元处理 JSON?
高版本 Delphi(XE7 以上,包括 10.2/10.3/10.4/11)都自带:
delphi
uses
System.JSON; // 只要引用这一个
不用引用奇怪的第三方库,原生最稳定。
本篇所有代码,都基于这个官方单元。
二、先做界面(非常简单)
拖这几个控件到窗体:
Button1:生成 JSON
Button2:解析 JSON
Memo1:显示结果
就够了。
三、实战 1:生成一段 JSON(发给接口用)
我们要生成这样一段 JSON:
json
{"code":200,"msg":"请求成功","data":{"name":"小明","age":20,"isStudent":true}}
直接复制代码:
delphi
// 生成 JSON
procedure TForm1.Button1Click(Sender: TObject);
var
RootObj, DataObj: TJSONObject;
begin
RootObj := TJSONObject.Create;
DataObj := TJSONObject.Create;
try
// 外层字段
RootObj.AddPair('code', TJSONNumber.Create(200));
RootObj.AddPair('msg', '请求成功');
// 内层 data 对象
DataObj.AddPair('name', '小明');
DataObj.AddPair('age', TJSONNumber.Create(20));
DataObj.AddPair('isStudent', TJSONBool.Create(True));
RootObj.AddPair('data', DataObj);
// 显示到Memo
Memo1.Lines.Text := RootObj.Format(2);
finally
RootObj.Free; // 会自动释放 DataObj
end;
end;
运行点击按钮,标准 JSON 直接出来。
四、实战 2:解析一段 JSON(最常用!)
这是你做接口、爬虫90% 的场景:
拿到一段 JSON 字符串,把里面的值取出来。
示例 JSON 字符串:
json
{"code":200,"msg":"success","data":{"username":"test123","score":95.5}}
解析代码:
delphi
// 解析 JSON
procedure TForm1.Button2Click(Sender: TObject);
var
RootObj: TJSONObject;
DataObj: TJSONObject;
code: Integer;
msg, username: string;
score: Double;
begin
RootObj := TJSONObject.ParseJSONValue(Memo1.Lines.Text) as TJSONObject;
if RootObj = nil then Exit;
try
// 读取外层
code := RootObj.GetValue<Integer>('code');
msg := RootObj.GetValue<string>('msg');
Memo1.Lines.Add('======== 解析结果 ========');
Memo1.Lines.Add('状态码:' + IntToStr(code));
Memo1.Lines.Add('提示信息:' + msg);
// 读取内层 data
DataObj := RootObj.GetValue<TJSONObject>('data');
if Assigned(DataObj) then
begin
username := DataObj.GetValue<string>('username');
score := DataObj.GetValue<Double>('score');
Memo1.Lines.Add('用户名:' + username);
Memo1.Lines.Add('分数:' + FloatToStr(score));
end;
finally
RootObj.Free;
end;
end;
你只要改:
'code'、'msg'、'data'、'username'
就能适配任何接口。
三、实战 3:解析 JSON 数组(列表必用)
很多接口返回列表,比如:
json
{"list":[{"name":"张三","age":18},{"name":"李四","age":19}]}
解析数组代码:
delphi
procedure TForm1.Button3Click(Sender: TObject);
var
RootObj: TJSONObject;
Arr: TJSONArray;
I: Integer;
name: string;
age: Integer;
begin
RootObj := TJSONObject.ParseJSONValue(Memo1.Lines.Text) as TJSONObject;
if RootObj = nil then Exit;
try
Arr := RootObj.GetValue<TJSONArray>('list');
if Assigned(Arr) then
begin
for I := 0 to Arr.Count - 1 do
begin
name := Arr.Items[I].GetValue<string>('name');
age := Arr.Items[I].GetValue<Integer>('age');
Memo1.Lines.Add(Format('姓名:%s,年龄:%d', [name, age]));
end;
end;
finally
RootObj.Free;
end;
end;
这就是做:
用户列表、订单、商品、日志、数据展示的核心代码。
四、新手最容易犯的 3 个错误
忘记释放对象
TJSONObject 一定要用 try…finally 并 Free,否则内存泄漏。
字段名写错
'username'≠'UserName',JSON 区分大小写。
类型不匹配
数字用:GetValue<Integer>或GetValue<Double>
布尔用:GetValue<Boolean>
五、学完 JSON 你能做什么?
对接网站 / 后台 API
做登录、注册、查询接口工具
爬虫解析网页返回的 JSON
小程序、APP 和桌面软件通信
自己写客户端 + 服务端
可以说:学会 JSON,才算真正会写联网软件。
六、本篇总结casii-cd.com
Delphi 自带System.JSON,不用第三方库。
生成 JSON:TJSONObject.AddPair。
解析 JSON:GetValue<类型>。
解析列表:TJSONArray循环遍历。
代码简单、通用、企业项目直接用www.xc.gx.cn