[Unity] JSON 직렬화/역직렬화(1)

muchan
muchan
∙∙조회 8

개요

JSON은 데이터를 저장하고 교환하기 위한 텍스트 포맷이다.
사람이 읽기 쉽고 중첩 구조를 표현할 수 있어 게임 세이브 데이터나 설정 파일 등에 적합하다.

구조

json
{
    "playerName": "ABC",
    "lives": 10,
    "health": 10.999,
    "position": {
        "X": 1.0,
        "Y": 2.0,
        "Z": 3.0
    },
    "items": ["검", "방패", "물약"]
}

  • 중괄호: 객체 (키-값 쌍의 집합)
  • 대괄호: 배열 (값의 순서 있는 목록)
  • 키: 반드시 문자열(큰 따옴표로 감쌈)
  • 콜론: 키와 값을 구분
  • 쉼표: 항목을 구분

position안에 새로운 객체 구조라 볼 수 있다

Unity JsonUtility

라이브러리 소개

  • JsonUtility는 Unity에 내장된 Json 직렬화 유틸리티
  • 추가 패키지 설치 없이 UnityEngine 네임스페이스에 바로 사용 가능
  • 내부적으로는 인스펙터에서 쓰는 Unity 직렬화 시스템을 그대로 재사용
  • [SerializeField], [Serializable] 규칙이 그대로 적용

핵심 특징:

  • Unity 내장 → 설치 필요 없음
  • 속도와 GC 부담이 Newtonsoft보다 일반적으로 가벼움
  • 인스펙터 직렬화 규칙을 그대로 따름 → 할 수 있는 것과 없는 것이 분명함

기본 API

메서드용도
JsonUtility.ToJson(obj, prettyPrint)객체 → JSON 문자열
JsonUtility.FromJson(json)JSON 문자열 → 새 객체
JsonUtility.FromJsonOverwrite(json, obj)기존 인스턴스의 필드를 JSON 값으로 덮어쓰기

직렬화 대상 규칙

  • 클래스에 [Serializable] 어트리뷰트 필요 (MonoBehaviour·ScriptableObject는 자동)
  • public 필드 또는 [SerializeField] private 필드만 대상
  • 프로퍼티({ get; set; })는 직렬화되지 않음 — 초보자가 가장 자주 당하는 함정
  • 중첩 클래스는 그 클래스도 [Serializable]이어야 함

잘 되는 것

  • int, float, bool, string, enum 등 기본 타입
  • Vector2, Vector3, Vector4, Quaternion, Color 등 Unity 수학 타입 — x/y/z/w 필드 형태로 그대로 직렬화됨
  • [Serializable]이 붙은 중첩 클래스/구조체
  • List, T[] (요소가 직렬화 가능한 타입일 때)

안되는 것

  • Dictionary<K, V>
  • 최상위 배열 or 리스트
  • 상속된 객체
  • null 객체
  • DateTime, Nullable, 튜플

Json을 직렬화 하는 다른 방법으로 Newtonsoft.Json 라이브러리를 이용하는 것이다.

JsonUtility는 위와 같이 안되는 객체들도 있고 제약이 많아서

성능이 중요한 요소일 때나 단순한 데이터 구조일 때를 제외하면 Newtonsoft.Json을 이용한다고 한다.

2편에서는 Newtonsoft.Json을 정리해보겠다.