본문 바로가기

프로그래밍/Delphi

[REST-Delphi #3] 델파이과 JSON

REST Servers in Delphi XE Using DataSnap 

[REST-Delphi #3] 델파이 JSON 


 JSON(JavaScript Object Notation)은 자바스크립트 객체에 대한 표기법으로 XML과 함께 델파이 REST 어플리케이션에서 주로 사용되므로 Delphi에서 JSON이 어떻게 처리 되는지 알아 두는 것이 중요합니다. 물론 REST사용지 JSON을 사용해야 하는 것은 아니지만 유행을 좋아하는 대한민국 개발자들에게 JSON은 임원진과, 고객의 신선한(?) 기대감에 만족을 줄 만한 포멧이지요....


JSON은 어플리케이션간 교환이 가능한 TEXT기반의 자바스크립트 객체의 표현 방식으로 기존에 다양한 데이터 구조를 표현할 수 있었던 XML에 비해 단순하고 프로그래밍 관점에서 더 밀접하고 자바스크립트를 이용하는 브라우저 기반의 어플리케이션에서 파싱하기 쉬운 장점과 타 언어와의 융합을 위해 적합한 형태로 인정 받고 있습니다.


JSON에 대한 보다 자세한 참고 : RFC 4627 기술서(IEFT) 또는 JSON 홈페이지(http://www.ietf.org/rfc.rfc4627.txt, http://json.org)


JSON이 이 제공하는 구조

   

   - JSON Objects : name:value 쌍으로 이루어진 집합 :

ex)  { "Name":"Marco", "Value":100 }

 

   - JSON Arrays : ","와 "{}" 로 구분된 배열 및 집합으로 표현된 리스트

        ex) 

  { "Me": { "FirstName":"Marco", "LastName":"Cantù", "Wife": "Lella", 

"Kids": [{ "Name":"Benedetta","Age":11 }, { "Name":"Jacopo","Age":7 } ] }} 

/


Delphi에서 제공하는 JSON


Delphi에서는 Delphi 2010 버전부터 JSON을 제공하고 있으며 "DBXJSON" 유닛에 JSON 처리를 위한 각종 클래스가 정의 되어 제공되고 있습니다.


기 정의된 JSON 객체

  기본 제공 : TJSONNull, TJSONFalse, TJSONTrue, TJSONString and TJSONNumber

  데이터 구조 제공 : TJSONObject (and the internal TJSONPair) and TJSONArray




JSON DEMO Source

unit FormJSON;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, DBXJSON, Vcl.StdCtrls;

type
  TfrmJSON = class(TForm)
    btnValues: TButton;
    mmLogs: TMemo;
    btnSimpleArray: TButton;
    btnSimpleObject: TButton;
    procedure btnValuesClick(Sender: TObject);
    procedure btnSimpleArrayClick(Sender: TObject);
    procedure btnSimpleObjectClick(Sender: TObject);
  private
    procedure LogAndFree(jValue: TJSONValue);
    { Private declarations }
  public
    { Public declarations }
  end;

var
  frmJSON: TfrmJSON;

implementation

{$R *.dfm}


//생성한 객체는 반드시 해제 해 주어야 함(로그 기록후 제거)
procedure TfrmJSON.LogAndFree (jValue: TJSONValue);
begin
  try
    mmLogs.Lines.Add(jValue.ClassName + ' > ' + jValue.ToString);
  finally
    jvalue.Free;
  end;
end;

// TJSONArray에 대한 테스트
procedure TfrmJSON.btnSimpleArrayClick(Sender: TObject);
var
  jList: TJSONArray;
begin
  jList := TJSONArray.Create;
  jList.Add(22);
  jList.Add('foo');
  jList.Add(TJSonArray.Create (TJSONTrue.Create));
  (jList.Get(2) as TJSonArray).Add (100);
  mmLogs.Lines.Add('**** btnSimpleArrayClick ****');
  mmLogs.Lines.Add(jList.ToString);
  jList.Free;
end;

// TJSONObject 값에 대한 테스트
procedure TfrmJSON.btnSimpleObjectClick(Sender: TObject);
var
  jsonObj, subObject: TJSONObject;
begin
  jsonObj := TJSONObject.Create;
  jsonObj.AddPair(TJSONPair.Create('Name', 'Marco'));
  jsonObj.AddPair(TJSONPair.Create('Value',
  TJSONNumber.Create(100)));
  subObject := TJSONObject.Create(TJSONPair.Create ('Subvalue', 'one'));
  jsonObj.AddPair( TJSONPair.Create ('Object', subObject));
  mmLogs.Lines.Add('**** btnSimpleObjectClick ****');
  mmLogs.Lines.Add(jsonObj.ToString);
  jsonObj.Free;
end;

// TJSONVALUE 값에 대한 테스트
procedure TfrmJSON.btnValuesClick(Sender: TObject);
begin
  mmLogs.Lines.Add('**** btnValuesClick ****');
  LogAndFree (TJSONNumber.Create(22));
  LogAndFree (TJSONString.Create('sample text'));
  LogAndFree (TJSONTrue.Create);
  LogAndFree (TJSONFalse.Create);
  LogAndFree (TJSONNull.Create);
end;
end.

JSON Demo 결과