TIL

이건선·2023년 7월 29일
0

해결

목록 보기
48/48

jsonEncode, jsonDecode

jsonEncode

userInfo.toJson()jsonEncode(userInfo.toJson())의 차이점은 반환되는 데이터 타입과 출력 형식입니다.

  1. userInfo.toJson():
    • 이 메서드는 ResponseModel 객체를 Dart의 Map 형태로 변환합니다.
    • print 함수에 전달할 때, Dart의 기본 Map 출력 형식을 사용하여 출력됩니다. 예를 들면, {key1: value1, key2: value2}와 같은 형식입니다.
  2. jsonEncode(userInfo.toJson()):
    • jsonEncode 함수는 Dart의 dart:convert 라이브러리에 포함되어 있으며, Dart 객체(이 경우에는 Map)를 JSON 형식의 문자열로 변환합니다.
    • 따라서, print 함수에 전달될 때, 표준적인 JSON 문자열 형식으로 출력됩니다. 예를 들면, {"key1": "value1", "key2": "value2"}와 같은 형식입니다.

결론적으로, userInfo.toJson()은 Dart의 Map 형식을 출력하고, jsonEncode(userInfo.toJson())은 그것을 JSON 형식의 문자열로 변환하여 출력합니다.

JSON 형식의 문자열은 데이터 전송, 파일 저장 등 외부 시스템과의 인터페이스에서 사용되며, Dart의 Map 형식은 앱 내부 로직에서 데이터를 처리하는 데 사용됩니다.

jsonDecode

jsonDecode는 Dart의 dart:convert 라이브러리에 있는 함수로, JSON 형식의 문자열을 Dart 객체로 변환하는 역할을 합니다. JSON 형식의 문자열을 파싱하여 Dart의 내장 타입인 Map<String, dynamic>, List<dynamic> 등의 객체로 변환합니다.

예를 들어, 다음과 같은 JSON 형식의 문자열이 있다고 가정해봅시다:

'{"name": "John", "age": 30, "city": "New York"}'

이 문자열을 Dart 객체로 변환하려면 jsonDecode 함수를 사용할 수 있습니다:

import 'dart:convert';

String jsonString = '{"name": "John", "age": 30, "city": "New York"}';
Map<String, dynamic> user = jsonDecode(jsonString);

print(user['name']); // 출력: John
print(user['age']);  // 출력: 30
print(user['city']); // 출력: New York

jsonDecode를 사용하면, JSON 형식의 문자열을 Dart에서 쉽게 다룰 수 있는 객체로 변환할 수 있어, 데이터 처리가 훨씬 간편해집니다. 일반적으로, 서버와 통신할 때 수신한 JSON 응답을 Dart 객체로 변환하여 앱에서 사용하게 됩니다.

데이터 액세스

Dart 언어에서 데이터에 액세스하는 두 가지 방식을 나타냅니다. 그러나 이들은 다른 타입의 객체에 대한 액세스 방식이므로, 사용하는 상황에 따라 선택해야 합니다.

  1. example['test']:
    • exampleMap 객체인 경우 사용됩니다. Map은 키-값 쌍의 컬렉션입니다. 여기서 'test'는 Map의 키로 사용되며 해당 키에 연관된 값을 반환합니다.
    • 예시:
      var example = {'test': 'value'};
      print(example['test']);  // 출력: value
      
  2. example.test:
    • example이 사용자 정의 객체나 다른 내장 객체(예: DateTime)의 인스턴스인 경우 사용됩니다. 여기서 test는 객체의 필드나 속성입니다.
    • 예시:
      class Example {
        String test = 'value';
      }
      
      var example = Example();
      print(example.test);  // 출력: value
      

차이점:

  • 타입: example['test']exampleMap 타입일 때 사용되며, example.testexample이 특정 클래스의 인스턴스일 때 사용됩니다.
  • 에러 발생: 만약 exampleMap이지만 'test' 키가 없을 경우, example['test']는 null을 반환합니다 (단, null safety를 사용하는 Dart 2.12 이후 버전에서는 에러가 발생합니다). 반면, example.test를 사용할 때 해당 속성이 객체에 없으면 컴파일 타임 에러가 발생합니다.
  • 유연성: example['test'] 형식은 실행 시간에 동적으로 키를 사용하여 액세스할 수 있습니다. 이는 변수나 사용자 입력을 기반으로 데이터에 액세스해야 하는 경우 유용합니다. 반면, example.test는 컴파일 타임에 정의된 속성에만 액세스할 수 있습니다.

이 두 방식을 혼동해서 사용하면 오류가 발생하기 때문에, 해당 데이터 타입과 상황에 따라 올바르게 선택해야 합니다.

profile
멋지게 기록하자

0개의 댓글