1. 为什么需要另一个Delphi JSON库?
在Delphi生态中,处理JSON数据一直是个让人又爱又恨的话题。System.JSON单元作为官方提供的解决方案,虽然功能完整,但用过的开发者都知道它存在几个明显的痛点:
首先,最让人头疼的是属性访问方式。想获取一个嵌套对象的字段值?你得写一长串的GetValue().GetValue()链式调用,代码看起来就像在走迷宫。更糟的是,每次访问都要手动检查返回值是否为nil,否则运行时异常就会找上门来。
delphi复制// 传统System.JSON的访问方式
var
jsonObj: TJSONObject;
userName: string;
begin
jsonObj := TJSONObject.ParseJSONValue(JsonString) as TJSONObject;
try
if Assigned(jsonObj.GetValue('user').GetValue('name')) then
userName := jsonObj.GetValue('user').GetValue('name').Value;
finally
jsonObj.Free;
end;
end;
其次,类型转换也是个麻烦事。System.JSON中所有值都以TJSONValue形式存在,需要开发者手动进行类型判断和转换。想读取一个整数?先得确认它是TJSONNumber,再调用AsInt。这种显式转换在简单场景下显得特别冗余。
内存管理同样让人提心吊胆。每个创建的TJSONObject都需要手动释放,在复杂逻辑中很容易出现内存泄漏。虽然可以用接口包装,但官方库并未提供开箱即用的解决方案。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 封装库的核心设计理念
基于这些痛点,我们的封装库确立了三个核心设计原则:
2.1 流畅的链式API
借鉴现代语言中流行的Fluent Interface设计,我们让每个方法调用都返回可继续操作的对象。比如要访问深层属性,现在可以这样写:
delphi复制userName := JObject(JsonString)['user']['name'].AsString;
这种写法不仅更符合直觉,还自动处理了nil值情况——如果中间任何节点不存在,会返回一个特殊的Null值对象而不会抛出异常。
2.2 智能类型推断
库内部实现了自动类型转换系统。当调用AsString、AsInteger等方法时,会尝试进行合理的类型转换:
- 数字可以自动转为字符串(123 → "123")
- 字符串形式的数字可以转为数值("3.14" → 3.14)
- 布尔值true/false可以转为1/0或"true"/"false"
delphi复制// 自动类型转换示例
count := JObject('{"count":"100"}')['count'].AsInteger; // 字符串转整数
active := JObject('{"active":1}')['active'].A
