SuperObject 定義 TSuperType 列舉代表 JSON 八種資料型別。掌握型別判斷與轉換,能避免執行期錯誤並撰寫健壯的泛型處理邏輯。
TSuperType = (stNull, stBoolean, stDouble, stInt, stObject, stArray, stString, stMethod);
function GetJsonTypeName(const obj: ISuperObject): string;
begin
case obj.DataType of
stNull: Result := 'stNull';
stBoolean: Result := 'stBoolean';
stDouble: Result := 'stDouble';
stInt: Result := 'stInt';
stObject: Result := 'stObject';
stArray: Result := 'stArray';
stString: Result := 'stString';
stMethod: Result := 'stMethod';
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var jo: ISuperObject;
begin
jo := SO('{A:1, B:2}'); ShowMessage(GetJsonTypeName(jo)); // stObject
jo := SO; ShowMessage(GetJsonTypeName(jo)); // stObject (空物件)
jo := SO('abc'); ShowMessage(GetJsonTypeName(jo)); // stString
jo := SO(123); ShowMessage(GetJsonTypeName(jo)); // stInt
jo := SO('123'); ShowMessage(GetJsonTypeName(jo)); // stInt (字串數字自動轉型)
jo := SO(3.14); ShowMessage(GetJsonTypeName(jo)); // stDouble
jo := SO('3.14'); ShowMessage(GetJsonTypeName(jo)); // stDouble
jo := SO(False); ShowMessage(GetJsonTypeName(jo)); // stBoolean
jo := SO('[1,2,3]'); ShowMessage(GetJsonTypeName(jo)); // stArray
jo := TSuperObject.Create(stMethod); ShowMessage(GetJsonTypeName(jo)); // stMethod
jo := SO('null'); ShowMessage(GetJsonTypeName(jo)); // stNull
end;
提供泛型式檢查,可避免介面為 nil 時存取 DataType 造成存取違規:
procedure TForm1.Button2Click(Sender: TObject);
var jo: ISuperObject;
begin
jo := SO('[]');
if jo.DataType = stArray then ShowMessage('stArray'); // 需確保 jo <> nil
if ObjectIsType(jo, stArray) then ShowMessage('stArray'); // 安全,nil 回傳 False
end;
| 目標型別 | 屬性/方法 | 備註 |
|---|---|---|
| Integer | .AsInteger / .I[key] | 自動從 Double、String 轉換 |
| Double | .AsDouble / .D[key] | |
| Boolean | .AsBoolean / .B[key] | |
| String | .AsString / .S[key] | |
| ISuperObject | .AsObject / .O[key] | 物件或陣列皆可 |
| TSuperArray | .AsArray / .A[key] | 僅陣列型別 |
ObjectIsType 或 DataType 確認型別,避免隱性轉換導致資料遺失(如 Double 轉 Int 截斷)。DataType 分派處理。stMethod 為 SuperObject 獨有擴充,標準 JSON 無對應,跨系統交換時需移除或轉換。