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 :

fpjson.pp
    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 :
  1. Il évite le déclenchement d'une exception si aucun élément de nom AName n'est trouvé.
  2. Il définit une valeur que sera retournée si aucun élément de nom AName n'est trouvé.
  3. 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

Vous pourriez laisser un commentaire si vous étiez connecté.