[Unity] JSON 직렬화/역직렬화(2)
댓글 0
댓글을 작성하려면 로그인이 필요합니다.
아직 댓글이 없습니다. 첫 번째 댓글을 작성해보세요!
1편
com.unity.nuget.newtonsoft-json으로 제공됨핵심 기능:
직렬화: C# 객체를 JSON 문자열로 변환
역직렬화: JSON 문자열을 C# 객체로 변환
Formatting.None: 한 줄로 출력 (파일 크기가 작다)
Formatting.Indented: 들여쓰기와 줄바꿈 적용 (사람이 읽기 편하다)
직렬화/역직렬화의 동작을 세밀하게 제어하는 설정 객체
var settings = new JsonSerializerSettings()
{
Formatting = Formatting.Indented,
TypeNameHandling = TypeNameHandling.All,
};
// settings를 전달하여 직렬화/역직렬화
var json = JsonConvert.SerializeObject(obj, settings);
var obj = JsonConvert.DeserializeObject<SaveData>(json, settings);
| 설정 | 설명 |
|---|---|
Formatting | Indented: 들여쓰기 / None: 한 줄 출력 |
TypeNameHandling | 직렬화 시 타입 정보 포함 여부 |
NullValueHandling | null 값 처리 방식 |
JSON에 C# 타입 정보를 포함시키는 설정임. 다형성(상속)이 있는 객체를 역직렬화할 때 원래 타입을 복원하기 위해 필요함
| TypeNameHandling | 설명 |
|---|---|
None | 타입 정보 포함하지 않음 (기본값) |
All | 모든 타입에 $type 추가 |
Auto | 선언 타입과 실제 타입이 다를 때만 추가 |
기본 직렬화 방식이 맞지 않는 경우가 있음:
대표적인 오류 메시지: JsonSerializationException: Self referencingloopdetected for property 'normalized' with type
Write와 Read 작성 순서는 상관없지만 Write를 먼저 작성하는게 개인적으로 순서가 맞는 느낌이다.
(일단 먼저 써놔야 읽을 수 있다는 개인적인 생각)
커스텀 컨버터를 적용하는 3가지 방법:
| 방법 | 코드 | 적용 범위 |
|---|---|---|
| 메서드 인자 전달 | JsonConvert.SerializeObject(obj, new MyConverter()) | 해당 호출에서만 |
[JsonConverter] 어트리뷰트 | 필드/클래스 선언부에 부착 | 해당 필드/클래스에 항상 |
| Settings.Converters | settings.Converters.Add(new MyConverter()) | 설정을 사용하는 모든 호출 |
3가지 중 하나 사용하면 된다
// 방법 1: 메서드 인자로 전달
string json = JsonConvert.SerializeObject(obj, Formatting.Indented, new Vector3Converter());
var obj = JsonConvert.DeserializeObject<PlayerState>(json, new Vector3Converter());
// 방법 2: 어트리뷰트
public class SaveItemData
{
[JsonConverter(typeof(ItemDataConverter))]
public ItemData itemData;
}
// 방법 3: Settings에 추가
var settings = new JsonSerializerSettings();
settings.Converters.Add(new Vector3Converter());
string json = JsonConvert.SerializeObject(obj, settings);
개인적으로 3번이 제일 편한 것 같다