Delphi原生JSON框架(一) TJsonValue

_成飞發表於2024-07-18

Delphi自帶了json支援,引用System.json,你就可以處理json,讀寫json格式的內容都是被支援的。發展了幾個版本,無論效能及穩定性都已經成熟,我不喜歡引用更多的三方到專案中,所以,對於Delphi處理json來說,自帶的是我的首選。

目前,Delphi Json的實現,支援json所有的型別:

TJSONObject

TJSONArray

TJSONNumber

TJSONString

TJSONTrue

TJSONFalse

TJSONNull

TJSONBool

這些型別都是從TJSONValue繼承而來,那我們就先看看這個TJSONValue都實現了什麼,以及怎麼使用他?

二、如何將字串轉換成JSON物件

TJSONValue類實現了ParseJSONValue方法,原型如下:

class function ParseJSONValue(const Data: string; UseBool: Boolean = False; RaiseExc: Boolean = False): TJSONValue; overload; static;

這個方法,將一個Json字串,轉換成一個TJSONValue物件。這是一個最常用的方法,因此是第一個要掌握的。

來看一下引數:

Data:需要處理的JSON串,這個方法,會將這個串轉換為UTF8進行處理

UseBool:是否有Boolean型別

RaiseExe:轉換過程中是否產生異常,預設情況下不產生異常,在不產生異常的情況下,如果轉換失敗,則返回nil。

現在我們看一個例子:

procedure TForm6.Button1Click(Sender: TObject);
var
  jsonstr:string;
  jv:TJSONValue;
  js:TJSONString;
begin
  jsonstr:=
            '{'                   + #13#10 +
            '    "person": {'        + #13#10 +
            '        "sex": "男",'     + #13#10 +
            '        "name": "王小二"' + #13#10 +
            '    }'                  + #13#10 +
            '}' ;

  jv:=TJSONValue.ParseJSONValue(jsonstr);
  if jv<>nil then
  begin
    if jv.TryGetValue<TJSONString>('person.sex',js) then
      ShowMessage(js.Value);
  end;

end;

上面的程式碼,將一個Json串轉換成TJsonValue物件,並讀出這個物件中的一個屬性值。如果在轉換的過程中有異常,是被忽略掉,並且返回nil。

注意:這個寫法,是Delphi 11後才可以的,以前版本ParseJSONValue方法是在TJSONObject類中實現的,因此,要用TJSONObject做為轉換物件來處理。

關於ParseJSONValue,官方同時還實現了5個過載的版本,如果掌握了上面說的版本,可以進一步去了解其他版本的用法,但基本是“回”字有幾種寫法的問題。

三、如何取得JSONValue物件

接下來,我們透過TryGetValue方法取得一個JSON中的物件,如你所見,在上面的程式碼中已經用到。先看一下他的原型宣告:

 function TryGetValue<T>(const APath: string; out AValue: T): Boolean; overload;

引數說明:

APath:JSON中物件的路徑,如果是多級的路徑,中間用“.”來分隔,參見程式碼。

AValue:輸出的物件

返回結果:Boolean型別,真表示取得物件,假表示沒有查到找對應APath的物件。

該方法使用泛型實現,因此,你可以取得所有型別的JSON物件。

我是喜歡用這個方法來取得具體型別的JSON物件,當APath在json串中不存在時,他不會產生異常!同時,我們也知道是否成功取得了結果。

四、如何取得JSONValue的值

當取得了JSONValue物件後,利用他提供的屬性可讀取具體的值了。當然,這裡你要知道取到的物件應該JSONValue的子類,諸如TJSONObject,TJSONString等。如上面的程式碼,我們取到一個TJSONString例項js,透過他的Value屬性就可讀取具體的值了。

注意:js.Value返回 男,而js.tostring則返回 “男”,是帶雙引號的。

上面是一種我喜歡的方法,但寫法有些繁瑣,需要建立js物件,那能不能直接根據APath讀取值呢?答案是有的,看下面這行程式碼:

 var s:= jv.P['person.sex'].Value;

透過TJSONValue.P屬性直接讀取指定Path對應的值。注意,與TryGetValue不同,如果Path不存在,將產生異常。

好了,寫到這裡,可以算入門了!

綜上所述,你現在應該知道:基於TJSONValue,可以將一個字串轉換成JSON物件,也可以將一個JSON物件轉換成字串,還可以判斷並讀取一個JSON子物件。

相關文章