Jump to content
과거의 기술자료(읽기 전용): https://tech.devgear.co.kr ×
과거의 기술자료(읽기 전용): https://tech.devgear.co.kr

이 사이트 검색

검색 태그: 'json 파싱'.

  • 태그로 검색

    태그 사이를 쉼표(,)로 구분하세요.
  • 작성자로 검색

콘텐츠 유형


게시판

  • 엠바카데로 (Embarcadero) 개발도구: 델파이 (Delphi), C++빌더 (C++Builder), RAD 스튜디오 (RAD Studio)
    • [기술 Q&A 게시판] 델파이, C++빌더, RAD 스튜디오
    • [설치/등록 Q&A 게시판] 델파이, C++빌더, RAD 스튜디오
    • [기술 기고 게시판] 델파이, C++빌더, RAD 스튜디오
    • [포트폴리오 게시판] 내가 참여한 프로젝트/프로그램 소개
    • [구인 게시판] 개발자 채용/프로젝트 의뢰
  • 엠바카데로 (Embarcadero) DBMS: 인터베이스 (InterBase)
    • [기술 Q&A 게시판] 인터베이스
    • [설치/등록 Q&A 게시판] 인터베이스
    • [기술 기고 게시판] 인터베이스
  • 비주얼 스튜디오 (Visual Studio) 관련 도구
    • [기술 Q&A 게시판] 비주얼 어시스트
    • [설치/등록 Q&A 게시판] 비주얼 어시스트
    • [기술 기고 게시판] 비주얼 어시스트
  • 구록 (Gurock) 테스트도구: 테스트레일 (TestRail)
    • [기술 Q&A 게시판] 테스트레일
    • [설치/등록 Q&A 게시판] 테스트레일
    • [기술 기고 게시판] 테스트레일
  • 아이데라 (Idera) 데이터 도구: 아쿠아 데이터 스튜디오 (Aqua Data Studio), ER/Studio 등
    • ER스튜디오 (ER/Studio)
    • 아쿠아 데이터 스튜디오 (Aqua Data Studio)
  • API레이어 (Apilayer) 개발 도구: API레이어 (Apilayer)
    • [Q&A 게시판] API레이어 (Apilayer)
  • 이 사이트 이용 관련
    • [게시판] 이 사이트 관련 이용 팁과 Q&A

Categories

  • 이달의 기술자료: 엠바카데로
  • 비디오 세미나
    • UX Summit
    • DelphiCon
    • CodeRage
    • 데브기어 세미나
  • 기술백서(PDF)

Categories

  • 시작하기
  • 설치/등록/라이선스
  • 튜토리얼
  • 도서

Categories

  • RAD 스튜디오 역사관
  • 11.0 알렉산드리아
  • 10.4 시드니
  • 10.3 리오
  • 10.2 도쿄
  • 10.1 베를린
  • 10.0 시애틀
  • XE8~XE
  • 2010~6.0

...에서 결과 찾기

검색어 일치 조건


최초 작성일

  • Start

    End


최종 변경일

  • Start

    End


개수로 필터링...

가입

  • Start

    End


Group


자주 쓰는 도구

  1. << DelphiCon 2021 목록으로 이동 원본 비디오(YouTube) 보기 (30 min) DelphiCon 의 2021 시리즈 중, Things That You Don’t Know About JSON in Delphi - Dion Carlos Mai & Gustavo Mena Barreto (25 min) 의 한글 요약본입니다. 델파이에서 JSON을 다루는 방법, JSON 파서를 가장 생산적으로 사용하는 방법, JSON 직렬화 작동을 커스터마이징하고 자동화하는 옵션을 설명합니다. 발표자 Gustavo Mena Barreto는 Aquasoft 선임 개발자이며, Dion Carlos Mai은 Aquasoft 개발팀장입니다. 이 세션에서 사용된 전체 소스코드: https://github.com/gustavomenabarreto/delphicon2021 목차 델파이에서 JSON 다루기를 주제로 정한 이유 JSON을 다룰 때 델파이에서 선택할 수 있는 것들 이 세션에서 사용할 JSON 샘플 JSON을 사용하기 위해 필요한 델파이 유닛(들) 1. 가장 간단한 방법 JSON 읽기 (아래 코드와 주석 참조) JSON 쓰기 (아래 코드와 주석 참조) 2. JsonToDelphi JSON 직렬화 행위를 변경하는 옵션(들) 3. Super Object (오픈소스) 4. RESTResponseDataSetAdapter 컴포넌트 REST API를 통해서 JSON 데이터를 받아서 델파이 폼에 표현하기 5. TJSONMarshal 클래스 델파이에서 JSON 다루기를 주제로 정한 이유 요즘 개발자에게 JSON은 매우 중요한 자리를 차지하고 있다. 요즘은 API 통합이 너무나 많다. 심지어 NoSQL JSON 데이터베이스도 있다. JSON을 다루는 방법이 여러가지 라는 사실을 잘 모르는 개발자들이 있다. 이 세션에서는 JSON을 다루는 여러 가지 방법을 설명한다. JSON을 다룰 때 델파이에서 선택할 수 있는 것들 가장 간단한 방법 JsonToDelphi: JSON 오브젝트를 가지고 델파이 클래스를 자동 생성하는 웹사이트 Super Object (오픈소스): 델파이 6, 7 등 구버전에서 JSON을 다룰 수 있음 (최신 버전 사용자에게는 권장하지 않음) RESTResponseDataSetAdapter 컴포넌트: JSON을 기반으로 데이터셋을 자동 생성 TJSONMarshal 클래스: JSON 직렬화 처리를 커스터마이징할 때 사용 이 세션에서 사용할 JSON 샘플 그림. 이 세션의 코드는 비트코인 블록체인에서 사용되는 매우 구조가 큰 JSON에서 극히 일부분만 뽑아 놓은 샘플 JSON을 사용한다. JSON을 사용하기 위해 필요한 델파이 유닛(들) uses System.JSON, REST.Json; 1. 가장 간단한 방법 TJSONObject와 TJSONArray를 사용하는 방법 JSON 읽기와 쓰기 (아래 코드와 주석 참조) // [JSON 읽기] var objeto : TJSONObject; ObjetoArray: TJSONArray; I: Integer; begin // ParseJSONValue를 이용하면, 단 한줄로 JSONObject를 만들 수 있다. objeto := TJsonObject.ParseJSONValue(MemoJson.Lines.Text) as TJSONObject; // JSONObject의 Get과 GetValue 메소드를 이용하면, JSON 개체의 모든 데이터에 접근할 수 있다. ShowMessage(objeto.Get('block_hash').ToString); ShowMessage(objeto.GetValue('block_hash').Value); // 배열 형식의 JSON값은 TJSONArray로 받을 수 있다. ObjetoArray := objeto.Get('inputs').JsonValue as TJSONArray; // JSONArray 안에 있는 각 요소는 for 루프를 통해 접근할 수 있다. for I := 0 to ObjetoArray.Size - 1 do begin MemoResultado.Lines.Add( ObjetoArray.Get(i).ToString + ': ' + ObjetoArray.Get(i).Value); end; end; // [JSON 쓰기] var objeto : TJSONObject; ObjetoArray: TJSONArray; ObjetoInputs: TJSONObject; begin objeto := TJSONObject.Create; ObjetoArray := TJSONArray.Create; // JSONObject의 AddPair (필드 이름, 필드 값) 메소드를 사용하여 데이터 쓰기 // 필드 값에 문자열 넣기 objeto.AddPair('block_hash','123456789'); // 필드 값에 JSONObject의 일종인 JSONArray 넣기 Objeto.AddPair('Inputs',ObjetoArray); // 'Input' 필드 값인 ObjetoArray에 들어 갈 JSONObject 만들기 ObjetoInputs := TJSONObject.Create; // 위와 동일하게 AddPair를 사용하여 JSONObject에 데이터 쓰기 ObjetoInputs.AddPair('prev_hash','987654321'); ObjetoInputs.AddPair('script','1'); // JSON 배열인 ObjetoArray의 Add 메소드를 이용하여, 배열 안에 요소 넣기 ObjetoArray.Add(ObjetoInputs); MemoResultado.Lines.Text := objeto.ToString; end; 2. JsonToDelphi https://jsontodelphi.com는 JSON 샘플을 넣으면, 해당 JSON을 다룰 수 있는 델파이 클래스를 자동으로 받을 수 있는 웹사이트이다. SOAP / XML 파서와 사용 방식이 상당히 유사하지만, XML이 아니라 JSON을 다룬다. 우리가 직접 해당 클래스를 만들기 위해 수작업으로 코드를 작성할 수도 있지만, 많은 API들이 방대한 JSON을 사용하고 있는데, 그 JSON을 모두 클래스로 만들 기 위해 수작업으로 코드를 쓰려면, 시간도 많이 걸리고 너무 수고스럽다. 무료 서비스인 이 웹사이트를 이용하면 그 모든 수고를 덜 수 있다. 생성된 클래스의 전체 소스 코드를 다운로드 할 수 있으므로, 필요한 부분을 직접 변경할 수도 있다. // [JsonToDelphi에서 만들어 준 클래스 사용하여 읽기] // 제공한 JSON 샘플의 구조가 모두 반영된 클래스가 생성되므로, 그냥 사용하면 된다. var TesteJson: TRoot; Inputs: TInputs; begin // JsonToDelphi가 만들어준 클래스 안에 JSON을 읽어서 넣기 TesteJson := TJson.JsonToObject<TRoot>(MemoJson.Lines.Text); // 데이터 타입까지 이미 알맞게 지정된 해당 클래스의 프로퍼티를 통해 JSON 필드를 접근 ShowMessage('BlockHash - '+TesteJson.BlockHash); for Inputs in TesteJson.Inputs do begin Showmessage('ScripType - '+Inputs.ScriptType); end; end; // [JsonToDelphi에서 만들어 준 클래스 사용하여 쓰기] var TesteJson: TRoot; Inputs: TInputs; I: Integer; begin // JsonToDelphi에서 만들어 준 클래스를 생성하고 TesteJson := TRoot.Create; // 프로퍼티를 이용하여 값을 쓴다. TesteJson.BlockHash := 'www.aquasoft.com.br'; // 마찬가지 방법으로 배열을 돌면서 값을 쓸 수도 있다. for I := 0 to 2 do begin Inputs := TInputs.Create; Inputs.Age := 20; Inputs.Script := 'teste script'; TesteJson.Inputs.Add(Inputs); end; // 단 한줄로 JSON 데이터를 문자로 풀어낼 수 있다. MemoResultado.Lines.Text := //이 때 joIgnoreEmptyStrings 옵션을 사용하면, 값이 빈 문자열인 데이터는, JSON 필드를 만들 지 않고 건너뛴다. // joIgnoreEmptyStrings는 델파이의 TJsonOption의 일종이다 (아래 본문의 설명 참조) TJson.ObjectToJsonString(TesteJson,[joIgnoreEmptyStrings]); end; JSON 직렬화 행위를 변경하는 옵션(들) 델파이의 REST.Json.TJsonOption https://docwiki.embarcadero.com/Libraries/Sydney/en/REST.Json.TJsonOption JSON 생성 작동 방식 중 원하는 옵션을 선택할 수 있다. 예: 유닉스 날짜 포맷 사용하기, UTC 날짜 사용, 들여쓰기, 카멜 표기, 등등 델파이 버전이 최신일수록 선택할 수 있는 직렬화 옵션이 더 많다. 이전 버전이라서 필요한 옵션이 없다면, 원하는 작동을 하는 코드를 수작업으로 써 넣는다. [그림. 델파이 11.0 알렉산드리아의 TJsonOption (참고: 이전 버전에는 옵션이 이것처럼 많지 않다)] 3. Super Object (오픈소스) 델파이 6, 7 등 구버전에서 JSON을 다룰 수 있음 무료 오픈 소스: https://github.com/hgourvest/superobject 델파이가 오래된 버전이지만, API 연동을 위해 JSON을 다루어야 한다면 이런 역할을 하는 DLL 또는 패키지의 도움을 받을 수 있다. 하지만, 직접 코드로 구현하려면 Super Object를 사용할 수 있다. 주의! 앞에서 설명했듯이, 최신 버전에는 이미 이런 기능들이 들어있으므로, Super Object를 굳이 사용할 이유가 없음 // [SuperObject를 사용하여 읽기] var Objeto: ISuperObject; Inputs: ISuperObject; begin // SuperObject의 SO 메소드를 사용하여 오브젝트를 생성 Objeto := SO(MemoJson.Lines.Text); // S 메소드는 원하는 필드와 값을 마치 배열처럼 접근 ShowMessage(Objeto.S['block_hash']); ShowMessage(Objeto['block_hash'].AsString); // for 루프 사용 가능 (for in 루프는 델파이 7 같은 구버전에는 없지만, for 문으로 유사하게 구현하면 된다.) for Inputs in objeto['inputs'] do begin MemoResultado.Lines.Add(Inputs.AsString); end; end; // [델파이 구버전에서 SuperObject를 사용하여 쓰기] var Objeto: ISuperObject; Inputs: ISuperObject; begin // 오브젝트 생성 Objeto := SO; // 데이터 쓰기 역시 마치 배열을 다루듯이 사용 Objeto.S['block_hash'] := '123456789'; Objeto.O['inputs'] := SA([]); Inputs := SO; Inputs.S['script'] := 'Teste script 1'; Inputs.I['age'] := 30; // JSON 배열을 쓸 수도 있다. Objeto.A['inputs'].O[0] := Inputs; Inputs := SO; Inputs.S['script'] := 'Teste script 2'; Inputs.I['age'] := 60; Objeto.A['inputs'].O[1] := Inputs; // AsString 메소드를 사용하여 JSON으로 쓸 수도 있다. MemoResultado.Lines.Text := Objeto.AsString; end; 4. RESTResponseDataSetAdapter 컴포넌트 RESTResponse에 받은 JSON 데이터를 FDMemTable 등의 데이터셋에 넣어주는 컴포넌트 (델파이 최근 버전에서 추가됨) [그림. REST 디버거를 사용하면 더 쉽게 만들 수 있다] REST API를 통해서 JSON 데이터를 받아서 델파이 폼에 표현하기 REST 디버거 (REST API의 읽기와 쓰기를 테스트하는 무료 도구)를 실행한다. 테스트가 성공했다면, [Copy Components] 버튼을 클릭한다. 그러면, 해당 REST API를 다루도록 설정이 완료된 델파이 컴포넌트가 클립보드에 복사된다. RESTClient: REST 서비스 제공자에게 요청을하고 응답을 받는 사용자 오브젝트 RESTRequest: RESTClient가 REST 서비스 제공자에게 전달하는 요청 RESTResponse: RESTClient가 REST 서비스 제공자로부터 전달받은 응답 RESTResponseDataSetAdapter: 전달받은 응답을 FDMemTable 등의 데이터셋에 넣어주는 매개체 FDMemTable: 데이터셋 델파이 폼에서 붙여넣기를 하면, 복사된 컴포넌트가 모두 추가되고, 되델파이 프로젝트에서 바로 사용할 수 있다. 그 후에는, 일반 데이터와 마찬가지로 FDMemTable을 사용하면 된다. 함께 복사된 REST 관련 컴포넌트들이 자동으로 이 데이터셋에 JSON 데이터를 담는다. FDMemTable 이 가장 좋고 편한 데이터셋이기 때문에 사용한다 (원한다면 다른 데이터셋을 사용해도 된다) 예를 들어, 데이터가 표현될 그리드의 데이터소스 즉 DataSource 컴포넌트의 DataSet 프로퍼티에 FDMemTable를 지정하면 된다. 직접 작성해야할 코드는 2줄 뿐이다 (아래 코드 참조) procedure TForm1.Button5Click(Sender: TObject); begin // REST 요청을 한다 RESTRequest1.Execute; // RESTResponse에 받은 JSON 데이터를 FDMemTable 등의 데이터셋에 넣기 RESTResponseDataSetAdapter1.Active := True; end; 5. TJSONMarshal 클래스 JSON 데이터 직렬화 알고리즘을 커스터마이징 할 수 있다. RTTI를 직접 건드릴 필요가 없기 때문에 보다 안전하고 편하다. RTTI를 잘못 다루면 쓰레드 문제가 발생할 수 있다. JSON을 다룰 때는 쓰레드를 사용하고 JSON 구조를 알맞게 맞추어 쓰는 것이 좋다. 보다 자세한 내용은 사용자 오브젝트 직렬화에 대한 상세한 Docwiki 도움말을 참고하기 바란다. // [TJSONMarshal을 사용하여 맞춤 JSON 구현하기] var lMarshal : TJSONMarshal; TesteJson: TRoot; //JsonToDelphi에서 제공하는 SuperObject 타입을 사용 Inputs: TInputs; I: Integer; begin TesteJson := TRoot.Create; // 오브젝트 생성 (SuperObject) TesteJson.BlockHash := 'www.aquasoft.com.br'; for I := 0 to 2 do begin Inputs := TInputs.Create; Inputs.Age := 20; Inputs.Script := 'teste script'; TesteJson.Inputs.Add(Inputs); end; // JSONMarshal을 생성할 때 컨버터를 지정 (커스터마이징을 위해 컨버터를 이용하는 것은 뒤에서 설명) lMarshal := TJSONMarshal.Create (TJSONConverter.Create); // Marshal 메소드를 사용하면 컨버터에 지정된 대로 컨버전 된다. MemoResultado.Lines.Text := lMarshal.Marshal(TesteJson).ToString(); lMarshal.Free; end; JSON 커스터마이징 방식 1: JSONMarshalled 어트리뷰트 사용 [JSONMarshalled(False)] // 이 어트리뷰트에서 False로 지정된 것, 즉 FScript는 생성될 JSON의 필드에 들어가지 않는다. FScript: string; JSON 커스터마이징 방식 2: RegisterConverter 프로시저를 오버로딩하기 프로시저 오버로딩을 통해 파서인 TJSONMarshal 클래스의 기본 전환 방식을 덮어쓰는 방법 JSON의 특정 필드의 데이터 타입 바꾸기 등 얼마든지 처리 로직을 바꿀 수 있다. (굳이 RTTI를 건드리지 않아도 된다) 좀 복잡하긴 하지만, 필요하다면 이처럼 TJSONMarshal 클래스를 생성할 때 컨버터를 파라미터로 넣는 방식을 쓸 수 있다. << DelphiCon 2021 목록으로 이동
  2. << DelphiCon 2021 목록으로 이동 원본 비디오(YouTube) 보기 (30 min) DelphiCon 의 2021 시리즈 중, Things That You Don’t Know About JSON in Delphi - Dion Carlos Mai & Gustavo Mena Barreto (25 min) 의 한글 요약본입니다. 델파이에서 JSON을 다루는 방법, JSON 파서를 가장 생산적으로 사용하는 방법, JSON 직렬화 작동을 커스터마이징하고 자동화하는 옵션을 설명합니다. 발표자 Gustavo Mena Barreto는 Aquasoft 선임 개발자이며, Dion Carlos Mai은 Aquasoft 개발팀장입니다. 이 세션에서 사용된 전체 소스코드: https://github.com/gustavomenabarreto/delphicon2021 목차 델파이에서 JSON 다루기를 주제로 정한 이유 JSON을 다룰 때 델파이에서 선택할 수 있는 것들 이 세션에서 사용할 JSON 샘플 JSON을 사용하기 위해 필요한 델파이 유닛(들) 1. 가장 간단한 방법 JSON 읽기 (아래 코드와 주석 참조) JSON 쓰기 (아래 코드와 주석 참조) 2. JsonToDelphi JSON 직렬화 행위를 변경하는 옵션(들) 3. Super Object (오픈소스) 4. RESTResponseDataSetAdapter 컴포넌트 REST API를 통해서 JSON 데이터를 받아서 델파이 폼에 표현하기 5. TJSONMarshal 클래스 델파이에서 JSON 다루기를 주제로 정한 이유 요즘 개발자에게 JSON은 매우 중요한 자리를 차지하고 있다. 요즘은 API 통합이 너무나 많다. 심지어 NoSQL JSON 데이터베이스도 있다. JSON을 다루는 방법이 여러가지 라는 사실을 잘 모르는 개발자들이 있다. 이 세션에서는 JSON을 다루는 여러 가지 방법을 설명한다. JSON을 다룰 때 델파이에서 선택할 수 있는 것들 가장 간단한 방법 JsonToDelphi: JSON 오브젝트를 가지고 델파이 클래스를 자동 생성하는 웹사이트 Super Object (오픈소스): 델파이 6, 7 등 구버전에서 JSON을 다룰 수 있음 (최신 버전 사용자에게는 권장하지 않음) RESTResponseDataSetAdapter 컴포넌트: JSON을 기반으로 데이터셋을 자동 생성 TJSONMarshal 클래스: JSON 직렬화 처리를 커스터마이징할 때 사용 이 세션에서 사용할 JSON 샘플 그림. 이 세션의 코드는 비트코인 블록체인에서 사용되는 매우 구조가 큰 JSON에서 극히 일부분만 뽑아 놓은 샘플 JSON을 사용한다. JSON을 사용하기 위해 필요한 델파이 유닛(들) uses System.JSON, REST.Json; 1. 가장 간단한 방법 TJSONObject와 TJSONArray를 사용하는 방법 JSON 읽기와 쓰기 (아래 코드와 주석 참조) // [JSON 읽기] var objeto : TJSONObject; ObjetoArray: TJSONArray; I: Integer; begin // ParseJSONValue를 이용하면, 단 한줄로 JSONObject를 만들 수 있다. objeto := TJsonObject.ParseJSONValue(MemoJson.Lines.Text) as TJSONObject; // JSONObject의 Get과 GetValue 메소드를 이용하면, JSON 개체의 모든 데이터에 접근할 수 있다. ShowMessage(objeto.Get('block_hash').ToString); ShowMessage(objeto.GetValue('block_hash').Value); // 배열 형식의 JSON값은 TJSONArray로 받을 수 있다. ObjetoArray := objeto.Get('inputs').JsonValue as TJSONArray; // JSONArray 안에 있는 각 요소는 for 루프를 통해 접근할 수 있다. for I := 0 to ObjetoArray.Size - 1 do begin MemoResultado.Lines.Add( ObjetoArray.Get(i).ToString + ': ' + ObjetoArray.Get(i).Value); end; end; // [JSON 쓰기] var objeto : TJSONObject; ObjetoArray: TJSONArray; ObjetoInputs: TJSONObject; begin objeto := TJSONObject.Create; ObjetoArray := TJSONArray.Create; // JSONObject의 AddPair (필드 이름, 필드 값) 메소드를 사용하여 데이터 쓰기 // 필드 값에 문자열 넣기 objeto.AddPair('block_hash','123456789'); // 필드 값에 JSONObject의 일종인 JSONArray 넣기 Objeto.AddPair('Inputs',ObjetoArray); // 'Input' 필드 값인 ObjetoArray에 들어 갈 JSONObject 만들기 ObjetoInputs := TJSONObject.Create; // 위와 동일하게 AddPair를 사용하여 JSONObject에 데이터 쓰기 ObjetoInputs.AddPair('prev_hash','987654321'); ObjetoInputs.AddPair('script','1'); // JSON 배열인 ObjetoArray의 Add 메소드를 이용하여, 배열 안에 요소 넣기 ObjetoArray.Add(ObjetoInputs); MemoResultado.Lines.Text := objeto.ToString; end; 2. JsonToDelphi https://jsontodelphi.com는 JSON 샘플을 넣으면, 해당 JSON을 다룰 수 있는 델파이 클래스를 자동으로 받을 수 있는 웹사이트이다. SOAP / XML 파서와 사용 방식이 상당히 유사하지만, XML이 아니라 JSON을 다룬다. 우리가 직접 해당 클래스를 만들기 위해 수작업으로 코드를 작성할 수도 있지만, 많은 API들이 방대한 JSON을 사용하고 있는데, 그 JSON을 모두 클래스로 만들 기 위해 수작업으로 코드를 쓰려면, 시간도 많이 걸리고 너무 수고스럽다. 무료 서비스인 이 웹사이트를 이용하면 그 모든 수고를 덜 수 있다. 생성된 클래스의 전체 소스 코드를 다운로드 할 수 있으므로, 필요한 부분을 직접 변경할 수도 있다. // [JsonToDelphi에서 만들어 준 클래스 사용하여 읽기] // 제공한 JSON 샘플의 구조가 모두 반영된 클래스가 생성되므로, 그냥 사용하면 된다. var TesteJson: TRoot; Inputs: TInputs; begin // JsonToDelphi가 만들어준 클래스 안에 JSON을 읽어서 넣기 TesteJson := TJson.JsonToObject<TRoot>(MemoJson.Lines.Text); // 데이터 타입까지 이미 알맞게 지정된 해당 클래스의 프로퍼티를 통해 JSON 필드를 접근 ShowMessage('BlockHash - '+TesteJson.BlockHash); for Inputs in TesteJson.Inputs do begin Showmessage('ScripType - '+Inputs.ScriptType); end; end; // [JsonToDelphi에서 만들어 준 클래스 사용하여 쓰기] var TesteJson: TRoot; Inputs: TInputs; I: Integer; begin // JsonToDelphi에서 만들어 준 클래스를 생성하고 TesteJson := TRoot.Create; // 프로퍼티를 이용하여 값을 쓴다. TesteJson.BlockHash := 'www.aquasoft.com.br'; // 마찬가지 방법으로 배열을 돌면서 값을 쓸 수도 있다. for I := 0 to 2 do begin Inputs := TInputs.Create; Inputs.Age := 20; Inputs.Script := 'teste script'; TesteJson.Inputs.Add(Inputs); end; // 단 한줄로 JSON 데이터를 문자로 풀어낼 수 있다. MemoResultado.Lines.Text := //이 때 joIgnoreEmptyStrings 옵션을 사용하면, 값이 빈 문자열인 데이터는, JSON 필드를 만들 지 않고 건너뛴다. // joIgnoreEmptyStrings는 델파이의 TJsonOption의 일종이다 (아래 본문의 설명 참조) TJson.ObjectToJsonString(TesteJson,[joIgnoreEmptyStrings]); end; JSON 직렬화 행위를 변경하는 옵션(들) 델파이의 REST.Json.TJsonOption https://docwiki.embarcadero.com/Libraries/Sydney/en/REST.Json.TJsonOption JSON 생성 작동 방식 중 원하는 옵션을 선택할 수 있다. 예: 유닉스 날짜 포맷 사용하기, UTC 날짜 사용, 들여쓰기, 카멜 표기, 등등 델파이 버전이 최신일수록 선택할 수 있는 직렬화 옵션이 더 많다. 이전 버전이라서 필요한 옵션이 없다면, 원하는 작동을 하는 코드를 수작업으로 써 넣는다. [그림. 델파이 11.0 알렉산드리아의 TJsonOption (참고: 이전 버전에는 옵션이 이것처럼 많지 않다)] 3. Super Object (오픈소스) 델파이 6, 7 등 구버전에서 JSON을 다룰 수 있음 무료 오픈 소스: https://github.com/hgourvest/superobject 델파이가 오래된 버전이지만, API 연동을 위해 JSON을 다루어야 한다면 이런 역할을 하는 DLL 또는 패키지의 도움을 받을 수 있다. 하지만, 직접 코드로 구현하려면 Super Object를 사용할 수 있다. 주의! 앞에서 설명했듯이, 최신 버전에는 이미 이런 기능들이 들어있으므로, Super Object를 굳이 사용할 이유가 없음 // [SuperObject를 사용하여 읽기] var Objeto: ISuperObject; Inputs: ISuperObject; begin // SuperObject의 SO 메소드를 사용하여 오브젝트를 생성 Objeto := SO(MemoJson.Lines.Text); // S 메소드는 원하는 필드와 값을 마치 배열처럼 접근 ShowMessage(Objeto.S['block_hash']); ShowMessage(Objeto['block_hash'].AsString); // for 루프 사용 가능 (for in 루프는 델파이 7 같은 구버전에는 없지만, for 문으로 유사하게 구현하면 된다.) for Inputs in objeto['inputs'] do begin MemoResultado.Lines.Add(Inputs.AsString); end; end; // [델파이 구버전에서 SuperObject를 사용하여 쓰기] var Objeto: ISuperObject; Inputs: ISuperObject; begin // 오브젝트 생성 Objeto := SO; // 데이터 쓰기 역시 마치 배열을 다루듯이 사용 Objeto.S['block_hash'] := '123456789'; Objeto.O['inputs'] := SA([]); Inputs := SO; Inputs.S['script'] := 'Teste script 1'; Inputs.I['age'] := 30; // JSON 배열을 쓸 수도 있다. Objeto.A['inputs'].O[0] := Inputs; Inputs := SO; Inputs.S['script'] := 'Teste script 2'; Inputs.I['age'] := 60; Objeto.A['inputs'].O[1] := Inputs; // AsString 메소드를 사용하여 JSON으로 쓸 수도 있다. MemoResultado.Lines.Text := Objeto.AsString; end; 4. RESTResponseDataSetAdapter 컴포넌트 RESTResponse에 받은 JSON 데이터를 FDMemTable 등의 데이터셋에 넣어주는 컴포넌트 (델파이 최근 버전에서 추가됨) [그림. REST 디버거를 사용하면 더 쉽게 만들 수 있다] REST API를 통해서 JSON 데이터를 받아서 델파이 폼에 표현하기 REST 디버거 (REST API의 읽기와 쓰기를 테스트하는 무료 도구)를 실행한다. 테스트가 성공했다면, [Copy Components] 버튼을 클릭한다. 그러면, 해당 REST API를 다루도록 설정이 완료된 델파이 컴포넌트가 클립보드에 복사된다. RESTClient: REST 서비스 제공자에게 요청을하고 응답을 받는 사용자 오브젝트 RESTRequest: RESTClient가 REST 서비스 제공자에게 전달하는 요청 RESTResponse: RESTClient가 REST 서비스 제공자로부터 전달받은 응답 RESTResponseDataSetAdapter: 전달받은 응답을 FDMemTable 등의 데이터셋에 넣어주는 매개체 FDMemTable: 데이터셋 델파이 폼에서 붙여넣기를 하면, 복사된 컴포넌트가 모두 추가되고, 되델파이 프로젝트에서 바로 사용할 수 있다. 그 후에는, 일반 데이터와 마찬가지로 FDMemTable을 사용하면 된다. 함께 복사된 REST 관련 컴포넌트들이 자동으로 이 데이터셋에 JSON 데이터를 담는다. FDMemTable 이 가장 좋고 편한 데이터셋이기 때문에 사용한다 (원한다면 다른 데이터셋을 사용해도 된다) 예를 들어, 데이터가 표현될 그리드의 데이터소스 즉 DataSource 컴포넌트의 DataSet 프로퍼티에 FDMemTable를 지정하면 된다. 직접 작성해야할 코드는 2줄 뿐이다 (아래 코드 참조) procedure TForm1.Button5Click(Sender: TObject); begin // REST 요청을 한다 RESTRequest1.Execute; // RESTResponse에 받은 JSON 데이터를 FDMemTable 등의 데이터셋에 넣기 RESTResponseDataSetAdapter1.Active := True; end; 5. TJSONMarshal 클래스 JSON 데이터 직렬화 알고리즘을 커스터마이징 할 수 있다. RTTI를 직접 건드릴 필요가 없기 때문에 보다 안전하고 편하다. RTTI를 잘못 다루면 쓰레드 문제가 발생할 수 있다. JSON을 다룰 때는 쓰레드를 사용하고 JSON 구조를 알맞게 맞추어 쓰는 것이 좋다. 보다 자세한 내용은 사용자 오브젝트 직렬화에 대한 상세한 Docwiki 도움말을 참고하기 바란다. // [TJSONMarshal을 사용하여 맞춤 JSON 구현하기] var lMarshal : TJSONMarshal; TesteJson: TRoot; //JsonToDelphi에서 제공하는 SuperObject 타입을 사용 Inputs: TInputs; I: Integer; begin TesteJson := TRoot.Create; // 오브젝트 생성 (SuperObject) TesteJson.BlockHash := 'www.aquasoft.com.br'; for I := 0 to 2 do begin Inputs := TInputs.Create; Inputs.Age := 20; Inputs.Script := 'teste script'; TesteJson.Inputs.Add(Inputs); end; // JSONMarshal을 생성할 때 컨버터를 지정 (커스터마이징을 위해 컨버터를 이용하는 것은 뒤에서 설명) lMarshal := TJSONMarshal.Create (TJSONConverter.Create); // Marshal 메소드를 사용하면 컨버터에 지정된 대로 컨버전 된다. MemoResultado.Lines.Text := lMarshal.Marshal(TesteJson).ToString(); lMarshal.Free; end; JSON 커스터마이징 방식 1: JSONMarshalled 어트리뷰트 사용 [JSONMarshalled(False)] // 이 어트리뷰트에서 False로 지정된 것, 즉 FScript는 생성될 JSON의 필드에 들어가지 않는다. FScript: string; JSON 커스터마이징 방식 2: RegisterConverter 프로시저를 오버로딩하기 프로시저 오버로딩을 통해 파서인 TJSONMarshal 클래스의 기본 전환 방식을 덮어쓰는 방법 JSON의 특정 필드의 데이터 타입 바꾸기 등 얼마든지 처리 로직을 바꿀 수 있다. (굳이 RTTI를 건드리지 않아도 된다) 좀 복잡하긴 하지만, 필요하다면 이처럼 TJSONMarshal 클래스를 생성할 때 컨버터를 파라미터로 넣는 방식을 쓸 수 있다. << DelphiCon 2021 목록으로 이동 View full 엠바카데로 기술자료
  3. 이 글에서는 요사이 많이 사용되는 JSON에 대해서 알아보고 델파이에서 JSON 데이터를 작성하거나 JSON데이터를 파싱(읽기) 하는 방법등에 대해서 정리해 보았다. JSON이란? JavaScript Object Notation의 약자로 데이터를 저장하거나 전송할 때 많이 사용되는 경량의 DATA 교환 형식이다. JSON 표현식은 사람과 기계 모두 이해하기 쉬우며 용량이 작아서, 최근에는 JSON이 XML을 대체해서 데이터 전송 등에 많이 사용한다. JSON은 데이터 포맷일 뿐이며 어떠한 통신 방법도, 프로그래밍 문법도 아닌 단순히 데이터를 표시하는 표현 방법일 뿐이다. JSON 특징 서버와 클라이언트 간의 교류에서 일반적으로 많이 사용된다. 다른 프로그래밍 언어를 이용해서도 쉽게 만들 수 있다. 특정 언어에 종속되지 않으며, 대부분의 프로그래밍 언어에서 JSON 포맷의 데이터를 핸들링 할 수 있는 라이브러리, 클래스들을 제공한다. JSON 문법 JSON 형식은 key/value가 존재할 수 있으며 key값이나 문자열은 항상 쌍 따옴표를 이용하여 표기한다. 개체, 배열 등의 표기를 사용할 수 있다. JSON형식에서는 null, number, string, array, object, boolean을 사용할 수 있다. JSON 형식 name-value형식의 쌍 값들의 순서화된 리스트 형식 델파이에서 사용되는 JSON 클래스들 아래 표에 표시된 JSON 데이터를 표현하기 위한 클래스들은 system.json에 정의 되어 있다. (TJSONReader, TJSONWriter 클래스는 뒤에서 설명) JSON 데이터 작성(쓰기) 아래 화면과 동일한 JSON 데이터를 작성하기 위해 각각 다른 방식으로 구현한 예제이다. 1. JSON Objects 사용 procedure TForm1.Button1Click(Sender: TObject); var JSONColor : TJSONObject; JSONObject : TJSONObject; JSONArray : TJSONArray; begin try JSONColor := TJSONObject.Create; JSONColor.AddPair('name', 'red'); JSONColor.AddPair('hex', '#f00'); JSONArray := TJSONArray.Create; JSONArray.Add(JSONColor); JSONObject := TJSONObject.Create; JSONObject.AddPair('colors', JSONArray); Memo1.Text := JSONObject.ToString; finally JSONObject.Free; end; end; 2. TJSonWriter 사용 TJSONWriter : JSON 데이터를 직렬화하는 논리를 제공하는 기본 클래스. TJsonTextWriter : JSON 콘텐츠를 작성하기 위해 TJsonWriter에서 확장된 클래스이다. TJsonTextWriter 는 잘못된 JSON에 대한 오류 검사를 제공한다. TStringWriter : 문자열에 쓰는 TTextWriter를 구현한다. 작성 중인 문자열은 TStringBuilder 인스턴스를 사용하여 작성된다. JSON 데이터를 작성하려면: 지정된 텍스트 작성기(TextWriter)에 데이터를 쓰는 JSONWriter를 작성한다. JSON 토큰이 생성될 적절한 Writer 메소드을 순차적으로 호출한다. 예를 들어 WriteStartObject를 호출하여 JSON 의 오브젝트의 시작 부분을 쓴다. procedure TForm1.Button2Click(Sender: TObject); var writer: TJsonWriter; StringWriter: TStringWriter; begin try StringWriter := TStringWriter.Create; Writer := TJsonTextWriter.Create( StringWriter ); Writer.WriteStartObject; Writer.WritePropertyName('colors'); Writer.WriteStartArray; Writer.WriteStartObject; Writer.WritePropertyName('name'); Writer.WriteValue('red'); Writer.WritePropertyName('hex'); Writer.WriteValue('#f00'); Writer.WriteEndObject; Writer.WriteEndArray; Writer.WriteEndObject; memo2.Text := Stringwriter.ToString; finally StringWriter.Free; Writer.Free; end; end; 3. TJSONObjectBuilder 사용 TJSONObjectBuilder : JSON 오브젝트를 작성하기 위한 다양한 인터페이스를 제공하는 JSONWriter 래퍼 클래스. TJsonTextWriter는 다음과 같은 몇 가지 추가 기능도 제공한다. 포맷 지정은 JSON 텍스트의 형식을 지정하는 방법을 나타낸다. 들여쓰기로 설정하면 결과는 들여쓰기가 있는 읽기 쉬운 JSON 데이터가 된다. procedure TForm1.Button3Click(Sender: TObject); var Builder : TJSONObjectBuilder; writer: TJsontextWriter; StringWriter: TStringWriter; StringBuilder: TStringBuilder; begin try StringBuilder := TStringBuilder.Create; StringWriter := TStringWriter.Create(StringBuilder); Writer := TJsonTextWriter.Create(StringWriter); Writer.Formatting := TJsonFormatting.Indented; Builder := TJSONObjectBuilder.Create(Writer); Builder .BeginObject .BeginArray('colors') .BeginObject .Add('name', 'red') .Add('hex', '#f00') .EndObject .EndArray .EndObject; memo3.Text := Stringbuilder.tostring; finally Builder.Free; writer.Free; StringWriter.Free; StringBuilder.Free; end; end; 그 외의 방법으로 Firedac 컴포넌트인 TFDBatchMove, TFDBatchMoveJsonWriter를 사용하여 텍스트(TFDBatchMoveTextReader 컴포넌트 사용), 데이터셋(TFDBatchMoveDataSetReader 컴포넌트 사용)을 Json 데이터로 생성할 수 있다. 아래 샘플에서는 C:\Users\Public\Documents\Embarcadero\Studio\22.0\Samples\Data 폴더에 있는 xml 데이터를 데이터셋에 로드하여 사용하였음(* 데이터베이스 사용하지 않고 테스트 할 수 있음) TFDBatchMove를 이용한 샘플 : JSON_BatchMove.zip JSON 파싱(읽기) 위에서 작성한 JSON 데이터를 아래 화면과 같이 다른 방법을 사용하여 파싱하는 예이다. 1. JSON Objects 사용 procedure TForm1.Button4Click(Sender: TObject); var JSONValue : TJSONvalue; begin JSONValue := TJSONObject.ParseJSONValue('{"colors":[{"name":"red", "hex":"#f00"}]}'); try Memo4.Lines.Add('READER:'); if JSONValue is TJSONArray then //... else if JSONVAlue is TJSONObject then Memo4.Lines.Add('colors'); Memo4.Lines.Add('name: '+ JSONValue.GetValue<string>('colors[0].name')); Memo4.Lines.Add('hex: '+ JSONValue.GetValue<string>('colors[0].hex')); finally JSONVAlue.Free; end; end; 2. TJSonReader 사용 TJSONReader : JSON 또는 유사한 형식의 직렬화된 데이터를 읽을 수 있는 기본 클래스. 이 클래스를 사용하기 위해서는 uses절에 System.JSON.Readers을 추가해야 한다. TJsonTextReader : JSON 형식으로 직렬화된 데이터를 읽는 클래스. TStringReader : 문자열에 대한 리더 클래스 데이터를 읽으려면: 텍스트 리더에서 데이터를 읽는 JSONReader 를 생성한다. 리더가 입력 데이터의 첫 번째 JSON 토큰으로 이동하도록 Read를 호출한다. TokenType은 토큰의 유형을 나타낸다. 또한 IsPrimitiveToken, IsStartToken 또는 IsEndToken을 사용하여 토큰 유형이 특정 토큰 유형 집합에 속하는지 여부를 확인할 수 있다. Value 속성은 토큰 값에 대한 액세스를 제공한다. 예를 들어 TokenType이 PropertyName이면 Value.AsString을 호출하여 속성 이름에 액세스 한다. CurrentState는 리더 상태를 나타낸다. LineNumber 및 LinePosition은 리더가 있는 입력 데이터 내 위치를 나타낸다. procedure TForm1.Button5Click(Sender: TObject); var LStringReader : TStringReader; LJsonTextReader : TJsonTextReader; begin LStringReader := TStringReader.Create('{"colors":[{"name":"red", "hex":"#f00"}]}'); LJsonTextReader:= TJsonTextReader.Create(LStringReader); try while LJsonTextReader.read do case LJsonTextReader.TokenType of TJsonToken.PropertyName: Memo5.Lines.Add(LJsonTextReader.Value.AsString); TJsonToken.String: Memo5.Lines[Memo5.Lines.Count-1] := Memo5.Lines[Memo5.Lines.Count-1] + ': ' +LJsonTextReader.Value.AsString; end; finally LStringReader.free; LJsonTextReader.Free; end; end; 3. TJONIterator 사용 JSON 리더가 제공하는 콘텐츠를 반복할 수 있다. lterrator는 JSON 리더와 유사하지만 몇 가지 추가 기능을 제공하고 약간 다르게 작동한다. 예를 들어: Lterator는 모든 토큰을 통과할 필요가 없다. 특정 배열 또는 개체 항목으로 이동하거나, 배열 및 개체의 일부를 건너뛰거나, 전체 배열 및 개체를 건너뛸 수 있다. lterrator 배열 또는 개체 값의 토큰에 있으면 해당 값과 일치하는 배열 인덱스 또는 개체 키를 읽을 수 있다. 해당 정보를 별도로 추적할 필요가 없다. terrator는 오브젝트 키에서 멈추지 않는다. 대신 키를 건너뛰고 해당 값의 토큰으로 반복한다. iterator의 Key 속성에서 Value 토큰의 키를 읽을 수 있다. JSONReader 의 내용을 반복하려면: JSON Reader에서 데이터를 읽는 JSON Lterator를 생성한다. Next메소드를 호출하면 리더가 입력 데이터의 첫 번째 JSON 토큰으로 이동한다. 유형은 토큰의 유형을 나타냅니다. 배열을 반복하는 경우 인덱스를 사용하여 현재 토큰의 인덱스를 가져온다. 오브젝트를 반복하는 경우 Key를 사용하여 현재 토큰의 키를 가져온다. Lterator의 값 속성 중 하나를 사용하여 현재 토큰의 값에 액세스한다. 예를 들어 유형이 부울이면 AsBoolean을 호출하여 현재 토큰의 부울 값에 액세스한다. Next를 계속 호출하여 입력 데이터의 모든 JSON 토큰을 살펴본다. Next는 입력 데이터의 끝에 도달하면 False를 반환한다. Recurse(되감기)를 사용하여 Lterator를 입력 데이터의 시작 부분으로 다시 이동할 수 있다. procedure TForm1.Button6Click(Sender: TObject); var LStringReader : TStringReader; LJsonTextReader : TJsonTextReader; LIterator : TJSONIterator; begin LStringReader := TStringReader.Create('{"colors":[{"name":"red", "hex":"#f00"}]}'); LJsonTextReader := TJsonTextReader.Create(LStringReader); LIterator := TJSONIterator.Create(LJsonTextReader); try LIterator.Next; Memo6.Lines.Add(LIterator.Key); LIterator.Recurse; LIterator.Next; LIterator.Recurse; LIterator.Next; Memo6.Lines.Add(LIterator.Key +': '+ LIterator.AsString); LIterator.Next; Memo6.Lines.Add(LIterator.Key +': '+ LIterator.AsString); finally LStringReader.Free; LJsonTextReader.Free; LIterator.Free; end; end; 샘플 소스 : JSON_Reader_Writer.zip
×
×
  • Create New...

중요한 정보

이용약관 개인정보보호정책 이용규칙 이 사이트가 더 잘 작동하기 위해 방문자의 컴퓨터에 쿠키가 배치됩니다. 쿠키 설정 변경에서 원하는 설정을 할 수 있습니다. 변경하지 않으면 쿠키를 허용하는 것으로 이해합니다.