Delphi用JSON操作ライブラリx-superobjectの特徴と使い方

基本的な使用方法

以下はJSONデータを操作する際の基本的なコード例です。


var
  Obj: ISuperObject;
begin
  Obj := SO;
  Obj.S['name'] := 'Onur YILDIZ';
  Obj.B['vip'] := True;
  with Obj.A['telephones'] do
  begin
    Add('000000000');
    Add('111111111111');
  end;
  Obj.I['age'] := 24;
  Obj.F['size'] := 1.72;
  with Obj.A['addresses'].O[0] do
  begin
    S['address'] := 'blabla';
    S['city'] := 'Antalya';
    I['postcode'] := 7160;
  end;
  Obj.A['addresses'].O[1].S['address'] := 'blabla';
  Obj.A['addresses'].O[1].S['city'] := 'Adana';
  Obj.A['addresses'].O[1].I['postcode'] := 1170;
end;

スーパーエクスプレッション機能

複雑なJSON構造を扱うための特殊な構文を示します。


const
  SampleJSON = '{ "items": { '+
    '"1234567890": { '+
    '"last_used": "2010-10-17T01:23:20",'+
    '"created": "2010-10-17T01:23:20",'+
    '"device": "iPhone 8s"'+
    ' },'+
    '"index": 0, '+
    '"data": {"index2": 1}, '+
    '"list": [ '+
    '{'+
    '"last_used": "2010-10-17T01:23:20",'+
    '"created": "2010-11-17T01:23:20",'+
    '"device": "iPhone 8s",'+
    '"numbers": [1,2,3]'+
    ' }, '+
    '{'+
    '"message": "hello"'+
    ' }'+
    ' ]'+
    '}';

var
  Obj: ISuperObject;
  NewData: ISuperObject;
  NewList: ISuperArray;
begin
  Obj := SO(SampleJSON);
  ShowMessage(Obj['items."1234567890"."last_used"'].AsString);
  ShowMessage(Obj['list[index]."created"'].AsString);
  ShowMessage(Obj['list[data.index2].message'].AsString);
  Obj['list[0].numbers'].AsArray.Add('test1');

  NewData := Obj['{a: list[index], b: list[data.index2].message, c: items."1234567890".device, d: 4, e: list[0].numbers[2], f: " :) "}'].AsObject;
  NewList := Obj['[list[index], list[data.index2].message, data.index2, index, 1, "1", "test"]'].AsArray;
end;

データフィルタリング


var
  DataObj: ISuperObject;
begin
  DataObj := SO('{ people: [ '+
    '{ '+
    'name: "Sakar SHAKIR", '+
    'gender: "M", '+
    'height: 1.75 '+
    ' }, '+
    '{ '+
    'name: "Bulent ERSOY", '+
    'gender: "F", '+
    'height: 1.60 '+
    ' }, '+
    '{ '+
    'name: "Cicek ABBAS", '+
    'gender: "M", '+
    'height: 1.65 '+
    ' } '+
    ' ] '+
    '}');

  Memo1.Lines.Add(
    DataObj.A['people'].Where(function(Item: IMember): Boolean
    begin
      with Item.AsObject do
        Result := (S['gender'] = 'M') and (F['height'] > 1.60)
    end).AsJSON
  );
end;

ソート処理


var
  Data: ISuperObject;
  SortedList: ISuperArray;
begin
  Data := SO('{b:1, a:2, d:4, c:2}');
  ShowMessage(Data.AsJSON);
  Data.Sort(function(Left, Right: IMember): Integer
  begin
    Result := CompareText(Left.Name, Right.Name);
  end);
  ShowMessage(Data.AsJSON);

  SortedList := SA('[{id:3}, {id:4}, {id:2}, {id:1}]');
  ShowMessage(SortedList.AsJSON);
  SortedList.Sort(function(Left, Right: IMember): Integer
  begin
    Result := CompareValue(Left.AsObject.I['id'], Right.AsObject.I['id']);
  end);
  ShowMessage(SortedList.AsJSON);
end;

オブジェクトマーシャリング


type
  TUser = class
  private
    FName: string;
    FGender: string;
    FHeight: Double;
  public
    property Name: string read FName write FName;
    property Gender: string read FGender write FGender;
    property Height: Double read FHeight write FHeight;
  end;

var
  User: TUser;
  JSONStr: string;
begin
  User := TUser.FromJSON('{"Name": "Onur YILDIZ", "Gender": "Male", "Height": 1.72}');
  JSONStr := User.AsJSON;
end;

コレクション処理


type
  TDataItem = record
    ID: Integer;
    Name: string;
  end;

var
  Items: TArray<TDataItem>;
  JSONStr: string;
begin
  Items := TJSON.Parse('[{"ID": 1, "Name": "Item1"}, {"ID": 2, "Name": "Item2"}]');
  JSONStr := TJSON.Stringify(Items);
end;

タグ: Delphi JSON Pascal x-superobject ObjectMapping

5月28日 22:04 投稿