[Delphi] 델파이 JSON 사용하기

    728x90

    안녕하세요

    로로봉입니다 : )

    오늘은 델파이에서 실제 JSON 텍스트를 활용하는 방법을 알아보겠습니다.


    JSON이란?

    JavaScript Object Notation의 축약어로 데이터를 저장하거나 전송할 때 많이 사용되는 경량의 DATA 교환 형식입니다.

    JavaScript에서 객체를 만들 때 사용하는 표현식을 의미합니다.

    JSON 표현식은 사람과 기계 모두 이해하기 쉬우며 용량이 작아서, 최근에는 JSON이 XML을 대체해서 데이터 전송에 많이 사용되고 있습니다.

    JSON은 데이터 형식의 종류일 뿐이며 데이터를 표시하는 표현 방법이라고 보면 됩니다.


    JSON의 형식

    JSON의 형식은 key / value 로 하나의 쌍을 이루며 쌍따옴표를 이용하여 표기해야 합니다.

    사용할 수 있는 형식은 null, number, string, array, object, boolean을 사용할 수 있습니다.

    기본적으로 하나의 키 값에 하나의 데이터로 구성되는 것을 볼 수 있습니다.

    // 단순한 JSON 형식
    {
      "Key1":"Value1",
      "Key2":"Value2",
      ...
      "Key10","Value10"
    }

    필요에 의해 하나의 Key 값에 Array 배열 데이터가 Value로 사용하는 경우도 아래와 같이 볼 수 있습니다.

    // 배열 JSON 형식
    {
      "Key1":"Value1",
      "Array1":[
        {"ArrayKey1-1":"ArrayValue1-1","ArrayKey1-2":"ArrayValue1-2"},
        {"ArrayKey2-1":"ArrayValue2-1","ArrayKey2-2":"ArrayValue2-2"}
      ],
      "Key2":"Value2"
    }

    JSON 프로토콜은 일반 자바스크립트의 객체처럼 원하는 만큼 중첩시켜서 사용이 가능합니다. 배열 안의 {} 객체도 여러개가 존재하여도 괜찮고 그 안에 Key:Value도 여러개 존재하여도 괜찮습니다.



    델파이에서 JSON 구조 생성

    델파이에서 JSON 형식의 프로토콜을 사용하기 위해선 System.JSON 을 Uses에 추가해주어야 합니다.

    uses
      System.JSON;

    TJSONObject를 선언 후 AddPair 함수를 사용해 원하는 Key 값에 Value를 넣어줄 수 있습니다.

    procedure
    var
      JSONObject : TJSONObject;
      JSONData   : TJSONObject;
    begin
      JSONOData  := TJSONObject.Create;
      JSONObject := TJSONObject.Create;
      
      JSONData.AddPair('Data1','데이터1');
      JSONData.AddPair('Data2','데이터2');
      JSONObject.AddPair('Group', JSONData);  // 'Group' 안에 'Data1', 'Data2' 포함
      JSONObject.AddPair('to','데이터3');
      
      ShowMessage(JSONObject.ToString);
    end;

    위와 같이 JSON을 구성한 경우 결과는 아래와 같습니다.

    {
      "Group":{
        "Data1":"데이터1",
        "Data2":"데이터2"
      },
      "to":"데이터3"
    }

    이런식으로 델파이에서 JSON을 만들고 ToString으로 JSON 텍스트를 전송할 수 있습니다.


    델파이에서 JSON 불러와서 사용하기

    델파이를 이용해 프로그램을 개발하다 보면 JSON 형식의 데이터를 받아들여 사용할 때가 많이 있습니다.

    아래 함수를 이용해 JSON 형식의 데이터를 추출하여 사용할 수 있습니다.


    // 함수명 : JSONConvert
    // 설  명 : JSON 텍스트에서 필드 추출
    function JSONConvert(usJSON, usName: string): string;
    var
      JSONPair : TJSONPair;
      JSONRoot : TJSONObject;
    begin
      JSONRoot := TJSONObject.ParseJSONValue(usJSON) as TJSONObject;
      JSONPair := TJSONPair(JSONRoot.Get(usName));
      if JSONPair <> nil then
        Result := JSONRoot.GetValue(usName).Value
      else
        Result := '';
    end;
    
    // 함수명 : JSONSubConvert
    // 설  명 : JSON 텍스트에서 서브 텍스트 추출
    function JSONSubConvert(usJSON, usSub: string): string;
    var
      JSONPair : TJSONPair;
      JSONRoot : TJSONObject;
      usReturn : string;
    begin
      JSONRoot := TJSONObject.ParseJSONValue(usJSON) as TJSONObject;
      JSONPair := TJSONPair(JSONRoot.Get(usSub));
    
      if JSONPair <> nil then
      begin
        usReturn := JSONRoot.GetValue(usSub).ToString;
        usReturn := StringReplace(usReturn,'"[','[',[]);
        usReturn := StringReplace(usReturn,']"',']',[]);
        Result := usReturn;
      end
      else
        Result := '';
    end;
    
    // 함수명 : JSONArrayConvertCnt
    // 설  명 : []배열 텍스트를 받아 배열 개수 응답
    function JSONArrayConvertCnt(usJSON: string): Integer;
    var
      JSONPair  : TJSONPair;
      JSONArray : TJSONArray;
    begin
      usJSON := StringReplace(usJSON,'\"','"',[rfReplaceAll]);
      JSONArray := TJSONObject.ParseJSONValue(usJSON) as TJSONArray;
    
      Result := JSONArray.Count;
    end;
    
    // 함수명 : JSONArrayConvert
    // 설  명 : []배열 텍스트의 인덱스에 위치한 데이터 추출하여 응답
    function JSONArrayConvert(usJSON, usName: string; Index: Integer): string;
    var
      JSONArray : TJSONArray;
    begin
      usJSON := StringReplace(usJSON,'\"','"',[rfReplaceAll]);
      JSONArray := TJSONObject.ParseJSONValue(usJSON) as TJSONArray;
      if (usJSON <> '[]') and (usJSON <> '') then
        Result := JSONConvert(JSONArray.Get(Index).ToString, usName)
      else
        Result := '';
    end;

    1) JSONConvert : 하나의 Key 값의 하나의 Value가 있는 경우 추출

    2) JSONSubConvert : 하나의 Key 값에 Value가 아닌 {} 오브젝트나 [] 배열 그대로의 텍스트 추출

    3) JSONArrayConvertCnt : [] 배열로 된 JSON 텍스트를 받아 내부 배열의 총 개수를 추출

    4) JSONArrayConvert : 몇번째 배열의 Key값에 해당하는 Value값을 추출

     

    좋아요 ♥ + 구독 부탁드립니다 : )

    728x90
    반응형

    댓글