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)
  • 엠바카데로 (Embarcadero) 라이선스 서버: ELC (Enterprise License Center)
    • [게시판] ELC (Enterprise License Center) 라이선스 서버
  • 이 사이트 이용 관련
    • [게시판] 이 사이트 관련 이용 팁과 Q&A

Categories

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

Categories

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

Categories

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

...에서 결과 찾기

검색어 일치 조건


최초 작성일

  • Start

    End


최종 변경일

  • Start

    End


개수로 필터링...

가입

  • Start

    End


Group


자주 쓰는 도구

  1. Docwiki에 있는 "JSON"을 번역한 글: 번역일: 2022년 6월 30일) 위로 가기: Using the RTL in Multi-Device Applications JSON(JavaScript Object Notation)은 언어에 종속적이지 않고 가벼운 데이터-교환 형식이다. JSON은 XML이나 YAML과 같은 다른 데이터-교환 형식의 대안으로 사용될 수 있다. RAD 스튜디오에는 JSON 프레임워크(들)이 있고 각 프레임워크에는 JSON 형식으로 된 데이터를 저장, 해독(Parse), 읽기, 쓰기, 생성을 담당하는 여러가지 클래스와 메소드가 들어있다. 목차 1 JSON 프레임워크(들) 1.1 JSON Object 프레임워크 1.2 Readers and Writers JSON 프레임워크 2 RAD 스튜디오에서 제공하는 JSON 프레임워크들 사이의 다른 점 3 JSON 처리(process)와 해독(parse): 10.3 버전에서 향상됨 4 JSON 주제 5 기타 자료 (See Also) 5.1 코드 예제(Sample) 1 JSON 프레임워크(들) RAD 스튜디오에서 JSON 데이터를 다루는 프레임워크는 몇가지가 있다. JSON Object 프레임워크: 이 프레임워크는 임시 오브젝트(들)을 생성하여 JSON 데이터를 읽고 쓴다. Readers and Writers JSON 프레임워크: 이 프레임워크는 JSON 데이터를 직접 읽고 쓸 수 있다. 1.1 JSON Object 프레임워크 이 JSON Object 프레임워크를 사용하면, 임시 오브젝트를 만들어서 JSON 데이터를 만들거나 해독(Parse)해야 한다. 즉, TJSONObject, TJSONArray, TJSONString와 같은 중간 매개자 역할을 하는 오브젝트를 메모리에 먼저 생성하고 나서 JSON 읽기와 쓰기를 하도록 되어 있다. 이 프레임워크에 대한 보다 자세한 내용은 JSON Objects Framework를 참고 1.2 Readers and Writers JSON 프레임워크 이 Readers and Writers JSON 프레임워크는 JSON 데이터를 스트림(stream)에서 직접 읽고 쓸 수 있으며, 임시 오브젝트를 만들지 않는다. 임시 오브젝트를 만들어서 JSON을 읽고 쓰는 방식이 아니므로, 성능과 메모리 사용면에서 더 좋다. "JSON Object 프레임워크"와 달리 "Readers and Writers JSON 프레임워크"는 BSON을 지원한다. 이 프레임워크에 대한 보다 자세한 내용은 Readers and Writers JSON Framework를 참고 2 RAD 스튜디오에서 제공하는 JSON 프레임워크들 사이의 다른 점 JSON 데이터를 가지고 작업을 할 때 이 두 프레임워크 중 어느 것을 사용해도 된다. 프로젝트의 요구에 더 잘 맞는 것을 선택하게 될 것이다. 아래 표에는 이 두 JSON 프레임워크 사이의 중요한 차이점 몇가지가 정리되어 있다. JSON Object 프레임워크 JSON 구조를 읽기가 더 쉽고, 반복(iteration)과 변경을 해당 모델 트리 안에서 수행할 수 있다. Readers and Writers JSON 프레임워크 스트림 안에 있는 JSON을 순차적으로 읽고 쓴다. 따라서 메모리를 더 적게 사용한다. BSON 지원 확장가능(Extensible) 아래 표는 동일한 JSON "쓰기"를 각 프레임워크에서 어떻게 코딩하는 지를 비교한다. JSON 쓰기 비교표 JSON Object 프레임워크 Readers and Writers JSON 프레임워크 TJSonWriter Readers and Writers JSON 프레임워크 TJSONObjectBuilder JSONColor := TJSONObject.Create; JSONColor.AddPair('name', '빨강'); JSONColor.AddPair('hex', '#f00'); JSONArray := TJSONArray.Create; JSONArray.Add(JSONColor); JSONObject := TJSONObject.Create; JSONObject.AddPair('colors', JSONArray); Writer.WriteStartObject; Writer.WritePropertyName('colors'); Writer.WriteStartArray; Writer.WriteStartObject; Writer.WritePropertyName('name'); Writer.WriteValue('빨강'); Writer.WritePropertyName('hex'); Writer.WriteValue('#f00'); Writer.WriteEndObject; Writer.WriteEndArray; Writer.WriteEndObject; Builder := TJSONObjectBuilder.Create(Writer); Builder .BeginObject .BeginArray('colors') .BeginObject .Add('name', '빨강') .Add('hex', '#f00') .EndObject .EndArray .EndObject; 위 표에 있는 코드 3개가 쓴 결과 JSON은 모두 아래와 같이 동일하다. { "colors":[ { "name":"빨강", "hex":"#f00" } ] } 아래 표는 동일한 JSON "읽기"를 각 프레임워크에서 어떻게 코딩하는 지를 비교한다. JSON 읽기 비교표 JSON Object 프레임워크 Readers and Writers JSON 프레임워크 TJsonReader Readers and Writers JSON 프레임워크 TJSONIterator JSONValue := TJSONObject.ParseJSONValue( '{"colors":[{"name":"빨강", "hex":"#f00"}]}'); Memo1.Lines.Add('READER:'); if JSONValue is TJSONArray then //... else if JSONVAlue is TJSONObject then Memo1.Lines.Add('colors'); Memo1.Lines.Add('name: '+ JSONValue.GetValue<string>('colors[0].name')); Memo1.Lines.Add('hex: '+ JSONValue.GetValue<string>('colors[0].hex')); LStringReader := TStringReader.Create( '{"colors":[{"name":"빨강", "hex":"#f00"}]}'); LJsonTextReader := TJsonTextReader.Create(LStringReader); while LJsonTextReader.read do case LJsonTextReader.TokenType of TJsonToken.PropertyName: Memo1.Lines.Add(LJsonTextReader.Value.AsString); TJsonToken.String: Memo1.Lines[Memo1.Lines.Count-1] := Memo1.Lines[Memo1.Lines.Count-1] + ': ' + LJsonTextReader.Value.AsString; end; LStringReader := TStringReader.Create( '{"colors":[{"name":"빨강", "hex":"#f00"}]}'); LJsonTextReader := TJsonTextReader.Create(LStringReader); LIterator := TJSONIterator.Create(LJsonTextReader); LIterator.Recurse; LIterator.Next; Memo1.Lines.Add(LIterator.Key); LIterator.Recurse; LIterator.Recurse; LIterator.Next; LIterator.Recurse; LIterator.Next; Memo1.Lines.Add(LIterator.Key +': '+ LIterator.AsString); LIterator.Next; Memo1.Lines.Add(LIterator.Key +': '+ LIterator.AsString); 위 표에 있는 코드 3개가 데이터를 읽어서 TMemo에 넣은 결과는 모두 아래와 같이 동일하다. colors name: 빨강 hex: #f00 3 JSON 처리(process)와 해독(parse): 10.3 버전에서 향상됨 JSON 코드의 정확성 향상: 즉, TJSONValue 클래스와 그 자손 클래스가 생성하는 JSON 코드 측면과 해독 측면에서 향상되었다. 성능 또한 향상되었다. TAsciiStreamWriter 클래스가 새로 추가됨: 이 클래스는 TJsonTextWriter와 함께 사용할 수 있으며 JSON 문자열을 생성할 때 성능을 가장 좋게 할 수 있다 (변환을 더 줄일 수 있기 때문). JSON 출력이 "더 보기 좋게 출력"되도록 새로 TJSONAncestor.Format(Indentation: Integer = 4)이 도입되었다. 그 결과 TJSON.Format은 더이상 사용되지 않는다. TJSONAncestor.ToJSON은 항상 형식적으로 유효한 JSON 문자열을 생산한다. TJSONAncestor.ToString도 비슷한 JSON 문자열을 만들긴 하지만 ASCII가 아닌 심볼(symbol)을 \uNNNN로 변환하지 않기 때문에 더 빠르지만 형식적으로 유효하지 않은 JSON을 생산하게 될 수 있다. JSON 해독(parsing) 지원 시 새로운 동작이 추가되어서, 이제는 원본 JSON 텍스트에 오류가 있는 경우에 할 수 있는 선택이 하나 더 생겼다. TJSONObject.TJSONParseOption.RaiseExc: 이것은 ParseJSONValue 메소드가 EJSONParseException 타입 예외(exception)를 발생시킬 것인지 아니면, (예전과 같이) nil을 반환할 것인지를 결정한다. 만약 이 옵션을 켜면 반환값은 해당 에러의 위치가 되고, 이번에 새로 추가된 System.JSON.EJSONParseException(여기에는 Path, Offset, Line, Position 프로퍼티들이 들어있다)을 발생시킨다. 추가로, 이 TJSONObject.ParseJSONValue 메소드에는 세번째 파라미터 즉 RaiseExc가 새로 생겼다. 이 옵션은 JSON 해독 에러 발생 시 예외(exception)을 발생 여부를 지정해놓은 글로벌 설정을 덮어쓴다. 4 JSON 주제 JSON 프레임워크: JSON Objects Framework Readers and Writers JSON Framework BSON 5 기타 자료 (See Also) System.JSON System.JSON.Builders System.JSON.Writers System.JSON.Readers System.JSON.BSON 5.1 코드 예제(Sample) RTL.JSON Iterator 코드 조각 RTL.JSON Reader 코드 조각 RTL.JSON Builder 코드 조각 RTL.JSON Writer 코드 조각 RTL.JSON Workbench 예문
  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 목록으로 이동
  3. << 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 엠바카데로 기술자료
  4. 이 글에서는 요사이 많이 사용되는 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...

중요한 정보

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