本文記錄作者將 JSON.org 官方 Java 版 JSONTokener 移植至 Delphi 過程中遇到的語言層級差異、設計抉擇與解決方案。這不只是程式碼翻譯,更是跨語言運行時模型的適配實戰。
Java 依賴垃圾回收,物件生命週期無需操心。Delphi 無 GC,若直接 Create 物件極易洩漏。作者引入 智慧指標(IAutoPtr<TObject>)模擬參考計數,所有 Token 解析產出的值物件(TStringObject、TBooleanObject 等)皆以介面形式回傳,離開作用域自動釋放。
Java 提供 Boolean、Integer、Long、Double 等包裝類別,可直接放入集合、多型處理。Delphi 基本型別非物件。作者依樣畫葫蘆建立 TBooleanObject、TIntegerObject、TLongObject、TDoubleObject 等包裝類別,並提供單例常數(如 TBooleanObject.TRUE),完美對應 Java 語意。
switch → case,StringBuffer → string 連接或 TStringBuilder。throws → raise,自訂 EJSONException。文中完整貼出 org.json.JSONTokener Java 原始碼(第 1-463 行),包含:
back、dehexchar、more、next 多載nextClean:跳過空白與註釋(//, /*, #)nextString:支援 \uXXXX、\xXX 跳脫nextTo、nextValue:核心解析分派Integer → Long → Double → StringskipTo、skipPast、syntaxError、toString「現在用 Delphi 的人不多,原因有兩點:1. 公司管理層問題。2. 成熟庫太少。既然第一點無法挽回,就讓我們在第二點上努力吧!」
這句話道出了開源庫建設的現實意義:彌補生態缺口,降低技術遷移門檻。
| Java 特性 | Delphi 對策 |
|---|---|
| 垃圾回收 | 智慧指標介面 IAutoPtr |
| 基本型別包裝類 | 自建 T*Object 階層 |
| 多型集合 | 介面型別 IAutoPtr<TObject> |
| StringBuilder | 字串連接 / TStringBuilder |
| Unicode 字串 | Delphi 2009+ 原生 Unicode |
完成 JSONTokener 後,將依序實作 JSONObject、JSONArray、JSONWriter 等單元,構建完整 DJSON 庫,支援 Delphi 2009 以上版本。
此系列不僅提供可用程式碼,更展示了資深開發者跨語言移植核心庫的思維路徑與工程權衡。