JSON

De Appmethod Topics
Aller à : navigation, rechercher

Remonter à Utilisation de la RTL dans les applications multi-périphériques


JSON (JavaScript Object Notation) est un format léger d'échange de données pouvant être utilisé comme alternative à d'autres formats d'échange de données tels que XML ou YAML. Appmethod fournit une unité, System.JSON, qui contient des classes et des méthodes pour stocker, analyser et gérer des données au format JSON.

Tous les types JSON sont pris en charge : TJSONObject, TJSONArray, TJSONNumber, TJSONString, TJSONTrue, TJSONFalse, TJSONNull -- tous les descendants de TJSONValue.

Les objets JSON peuvent être instanciés et construits incrémentiellement, ou un flux d'octets peut y être analysé.

Dans l'extrait de code ci-dessous, un objet avec une paire "Hello": "World" est créé :

var
  LJSONObject: TJSONObject;

begin
  LJSONObject:= TJSONObject.Create;
  LJSONObject.AddPair(TJSONPair.Create(TJSONString.Create('Hello'),
                                       TJSONString.Create('World')));

La fonction de classe statique ParseJSONValue ou la fonction Parse peut être utilisée pour analyser le flux d'octets dans l'instance de la valeur JSON équivalente.

  class function ParseJSONValue(const Data: TBytes; const Offset: Integer): TJSONValue; overload; static;

Par exemple, avec :

const
  GJSONString =
    '{' +
    '    "name": {'+
    '        "A JSON Object": {' +
    '          "id": "1"' +
    '        },' +
    '        "Another JSON Object": {' +
    '          "id": "2"' +
    '        }' +
    '    },' +
    '    "totalobjects": "2"' +
    '}';

vous pouvez transformer la représentation de la chaîne JSON en un JSON par l'utilisation de l'un des extraits de code ci-dessous.

  1. En utilisant ParseJSONValue :
procedure ConsumeJsonString;
var
  LJSONObject: TJSONObject;

begin
  LJSONObject := nil;
  try
    { convert String to JSON }
    LJSONObject := TJSONObject.ParseJSONValue(TEncoding.ASCII.GetBytes(GJSONString), 0) as TJSONObject;

    { output the JSON to console as String }
    Writeln(LJSONObject.ToString);
  finally
    LJSONObject.Free;
  end;
  1. En utilisant Parse :
procedure ConsumeJsonBytes;
var
  LJSONObject: TJSONObject;

begin
  LJSONObject := nil;
  try
    LJSONObject := TJsonObject.Create;
    { convert String to JSON }
    LJSONObject.Parse(BytesOf(GJSONString), 0);

    { output the JSON to console as String }
    Writeln(LJSONObject.ToString);
  finally
    LJSONObject.Free;
  end;
end;

Les deux extraits de code provoquent l'affichage des données suivantes sur la console :


{"name":{"A JSON Object":{"id":"1"},"Another JSON Object":{"id":"2"}},"totalobjects":"2"}

Cycle de vie

Dans JSON, l'objet parent possède l'une quelconque des valeurs qu'il contient, à moins que la propriété Owned ne soit définie sur False. Dans ce cas, la destruction d'un objet tableau JSON ignore chaque membre ayant l'indicateur défini sur False. Cette fonctionnalité permet la combinaison de divers objets en objets plus gros tout en conservant la possession. Par défaut, la propriété est définie sur True, ce qui signifie que toutes les instances contenues sont possédées par leur parent.

Clonage

Tous les types JSON peuvent être clonés. L'opération de clonage est un clone profond. L'objet cloné possédera toutes les instances JSON.

Les méthodes serveur acceptent tous les types JSON en tant qu'entrée, sortie ou paramètres de retour. Mais elles ne les possèdent pas. Les instances JSON sont libérées en fin d'exécution de la méthode serveur. Une méthode peut lire les objets JSON et réagir au contenu, mais si un stockage supplémentaire est requis, l'objet doit alors être cloné.