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

Recommended Posts

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 프레임워크(들)

RAD 스튜디오에서 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 주제

5 기타 자료 (See Also)

5.1 코드 예제(Sample)

이 댓글 링크
다른 사이트에 공유하기

이 토의에 참여하세요

지금 바로 의견을 남길 수 있습니다. 그리고 나서 가입해도 됩니다. 이미 회원이라면, 지금 로그인하고 본인 계정으로 의견을 남기세요.

Guest
이 토픽(기고/질문)에 답하기

×   서식있는 텍스트로 붙여넣기.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   이전에 작성한 콘텐츠가 복원되었습니다..   편집창 비우기

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

중요한 정보

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