====== JSON ====== ===== Créer un JSON ===== ==== A partir d'un String ==== var vJD: TJsonData; begin vJD := GetJSON(AString); try if assigned(vJD) then { Ok le JSON est valide } begin ... end; finally vJD.free; end; end; ===== Lire une valeur ===== ==== TJSonObject.Get ==== ''JSon.GET('Nom element', VALEUR PAR DEFAUT);''\\ ou\\ ''JSon.GET('Nom element');''... mais voir remarque ci-dessous ! var vJO: TJSonObject; begin FBigEndian:=vJO.Get('bendian',false); end; Fonctionne sur : Function Get(Const AName : String) : Variant; Function Get(Const AName : String; ADefault : TJSONFloat) : TJSONFloat; Function Get(Const AName : String; ADefault : Integer) : Integer; Function Get(Const AName : String; ADefault : Int64) : Int64; Function Get(Const AName : String; ADefault : QWord) : QWord; Function Get(Const AName : String; ADefault : Boolean) : Boolean; Function Get(Const AName : String; ADefault : TJSONStringType) : TJSONStringType; Function Get(Const AName : String; ADefault : TJSONUnicodeStringType) : TJSONUnicodeStringType; Function Get(Const AName : String; ADefault : TJSONArray) : TJSONArray; Function Get(Const AName : String; ADefault : TJSONObject) : TJSONObject; Remarquez que chaque Function **Get** peut prendre un paramètre //ADefault//.\\ C'est intéressant d'utiliser ce paramètre pour 3 raisons : - Il évite le déclenchement d'une exception si aucun élément de nom //AName// n'est trouvé. - Il définit une valeur que sera retournée si aucun élément de nom //AName// n'est trouvé. - Il permet de savoir quel **Get** on utilisera en fonction de son type.\\ Cela evite d'appeler le **Get** générique qui passe par les Variants ==== TJSonData.FindPath ==== Pour récuperer le JSONArray ''version'' dans le JSON suivant : { "json_format_version": [ 1, 0 ], "smartctl": { "version": [ 7, 2 ], "svn_revision": "5155", "build_info": "(sf-7.2-1)", "exit_status": 0 } } On peut utiliser le code ci-dessous (''TJsonData.FindPath''): vJSA:=TJSONArray(OutJSON.FindPath('smartctl.version')); Pour avoir seulement le ''7'' : var vJD: TJSonData; ... vJD:= OutJSON.FindPath('smartctl.version[0]'); if assigned(vJD) then Result:=vJD.AsString; ==== TJSonObject.Find (la sécurité) ==== Dans l'exemple ci dessous on veut récupéré un eventuel JSonArray dans le JSonObject ''vJO''. var vJO: TJSONObject; vJA: TJSonArray; vI: integer; vS: string; begin ... if vJO.Find('dependencies',vJA) then for vI := 0 to vJA.Count - 1 do vS:= vS+vJA.Strings[vI]; ... end; ''TJsonObject.Find'' fonctionne avec tous ces types : Function Find(Const AName : String) : TJSONData; overload; Function Find(Const AName : String; AType : TJSONType) : TJSONData; overload; function Find(const key: TJSONStringType; out AValue: TJSONData): boolean; function Find(const key: TJSONStringType; out AValue: TJSONObject): boolean; function Find(const key: TJSONStringType; out AValue: TJSONArray): boolean; function Find(const key: TJSONStringType; out AValue: TJSONString): boolean; function Find(const key: TJSONStringType; out AValue: TJSONBoolean): boolean; function Find(const key: TJSONStringType; out AValue: TJSONNumber): boolean; ====== Sources & Ressources ====== * [[https://darrylsite.developpez.com/tutoriels/pascal/json/]] * [[https://wiki.freepascal.org/fcl-json]] * [[https://wiki.freepascal.org/Streaming_JSON|Loading and storing (streaming) objects (TObject -> JSON)]]