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子物件。