본문 바로가기
Technology/Computer

Unity JsonUtility 와 Newtonsoft.Json 비교, 차이

by re-moon 2025. 3. 31.

 

유니티를하다가 컴퓨터 박살낼뻔 해서 적는글

 

Unity JsonUtility vs Newtonsoft.Json 비교 분석

1. 개요

JsonUtility와 Newtonsoft.Json은 C#에서 JSON 데이터를 직렬화(객체 → JSON) 및 역직렬화(JSON → 객체)하는 데 사용됩니다.

  • JsonUtility: Unity에서 기본 제공하는 JSON 직렬화 도구. 빠르고 가볍지만 기능이 제한적.
  • Newtonsoft.Json (Json.NET): 가장 널리 사용되는 JSON 라이브러리. 강력한 기능과 높은 유연성을 제공.

2. 기능 비교

기능 JsonUtility (Unity 기본) Newtonsoft.Json (Json.NET)

속도 빠름 (C++ 기반) 🔴 조금 느림 (반면 강력한 기능)
파일 크기 작음 (Unity 내장) 🔴 조금 큼 (외부 패키지 필요)
지원하는 데이터 구조 🔴 제한적 (기본 클래스만) 유연함 (Dictionary, List, Nested Object 지원)
Nullable 타입 (int?, float?) 🔴 지원 안함 (무시됨) 완벽 지원
Dictionary<> 지원 🔴 지원 안함 지원
복잡한 객체 (중첩 클래스, 배열, 리스트 등) 🔴 지원 제한적 완벽 지원
필드 이름 변경 (JsonProperty 등) 🔴 지원 안함 지원 ([JsonProperty("custom_name")])
null 값 유지 🔴 null 값 무시됨 ✅ null 값 유지
속성 기반 직렬화 ([JsonIgnore], [JsonProperty]) 🔴 지원 안함 지원
LINQ 쿼리 지원 🔴 지원 안함 지원
JSON 파일 구조 유지 🔴 제한적 (필드 없으면 무시) 유지 가능
JSON Schema Validation (검증) 🔴 지원 안함 지원
C# enum 지원 🔴 문자열 변환 불가 문자열 변환 가능
C# DateTime 자동 변환 🔴 지원 안함 지원
읽기 전용 필드 (readonly) 🔴 지원 안함 지원 ([JsonConstructor])
지원하는 플랫폼 ✅ 모든 Unity 플랫폼 ✅ .NET 및 Unity에서 사용 가능

3. JsonUtility vs Newtonsoft.Json의 핵심 차이점

(1) null 값 처리 차이점

🔴 JsonUtility는 null을 무시

{
    "year": null,
    "month": 5,
    "day": null,
    "name": "어린이날"
}

위 데이터를 JsonUtility로 읽으면:

public class HolidayData {
    public int? year;
    public int? month;
    public int? day;
    public string name;
}

🚫 JsonUtility가 null을 무시하여 year, day 값이 없어짐:

HolidayData { month = 5, name = "어린이날" }

이제 year와 day 값이 사라져서 비교할 수 없음!


✅ Newtonsoft.Json은 null을 정확히 유지

string json = "{ \"year\": null, \"month\": 5, \"day\": null, \"name\": \"어린이날\" }";
var holiday = JsonConvert.DeserializeObject<HolidayData>(json);

✔ Newtonsoft.Json을 사용하면 null이 유지됨:

HolidayData { year = null, month = 5, day = null, name = "어린이날" }

이제 year, day가 null인 상태로 남아있어 비교 가능.


(2) Dictionary<> 지원 여부

🔴 JsonUtility는 Dictionary<>를 지원하지 않음

Dictionary<string, int> data = new Dictionary<string, int>
{
    { "A", 1 },
    { "B", 2 }
};

string json = JsonUtility.ToJson(data); // 🚫 오류 발생!

🚫 Unity JsonUtility는 Dictionary<>를 변환할 수 없음.


✅ Newtonsoft.Json은 Dictionary<>를 지원

string json = JsonConvert.SerializeObject(data);
Dictionary<string, int> parsed = JsonConvert.DeserializeObject<Dictionary<string, int>>(json);

✔ Newtonsoft.Json을 사용하면 Dictionary<> 변환이 가능.


(3) 속성([JsonProperty]) 지원 여부

🔴 JsonUtility는 지원하지 않음

C#에서 JSON 필드 이름을 변경할 수 없음.


✅ Newtonsoft.Json은 [JsonProperty] 지원

public class HolidayData
{
    [JsonProperty("custom_name")]
    public string Name { get; set; }
}

✔ JSON에서 "custom_name" 필드를 읽어서 Name 속성으로 변환 가능.


(4) 속도 차이

  • JsonUtility는 C++ 기반으로 최적화되어 속도가 빠름.
  • Newtonsoft.Json은 동적 타입 변환을 지원하므로 약간 느림.
  • 하지만 일반적인 게임에서는 Newtonsoft.Json의 속도가 큰 문제는 되지 않음.

4. JsonUtility를 써야 할 때

JsonUtility를 사용하는 것이 좋은 경우

  • 속도가 중요한 경우 (JsonUtility는 Newtonsoft.Json보다 약 3~4배 빠름)
  • JSON 구조가 단순한 경우 (객체 내부에 List<>, Dictionary<>, null 값이 필요하지 않을 때)
  • Unity 기본 제공 기능만 사용하고 싶을 때 (추가 패키지를 설치하지 않고 가벼운 프로젝트에서)

🚫 JsonUtility를 사용하면 안 되는 경우

  • JSON에 null 값이 필요할 때
  • Dictionary<>, 중첩 객체, 리스트 등을 변환할 때
  • JSON 필드 이름을 변경해야 할 때 ([JsonProperty] 같은 기능이 필요할 때)
  • JSON 데이터를 유지하면서 일부 값만 수정하고 싶을 때

5. Newtonsoft.Json을 써야 할 때

Newtonsoft.Json을 사용하는 것이 좋은 경우

  • JSON 데이터를 정확하게 유지해야 할 때
  • null 값을 유지해야 할 때
  • Dictionary<>, List<>, 중첩 객체 등을 JSON으로 변환해야 할 때
  • 속성이 많은 복잡한 데이터 구조를 직렬화/역직렬화해야 할 때
  • JSON 파일을 저장/수정하고 다시 불러오는 기능이 필요할 때

🚫 Newtonsoft.Json을 사용하면 안 되는 경우

  • JSON 파싱 속도가 매우 중요한 경우 (예: 매 프레임마다 JSON을 불러와야 하는 경우)

6. 결론 (요약)

비교 항목 JsonUtility (Unity 기본) Newtonsoft.Json (Json.NET)

속도 ✅ 빠름 🔴 느림
파일 크기 ✅ 작음 🔴 큼 (외부 라이브러리 필요)
Nullable 값 (null) 지원 ❌ 지원 안함 ✅ 지원
Dictionary<> 지원 ❌ 불가능 ✅ 가능
속성 기반 직렬화 ([JsonProperty]) ❌ 지원 안함 ✅ 지원
JSON 유지 가능 여부 ❌ 제한적 ✅ 유지 가능

✅ JsonUtility는 빠르고 가벼운 JSON 변환이 필요할 때 적합
✅ Newtonsoft.Json은 복잡한 JSON 데이터를 다룰 때 적합

👉 결론적으로 대부분의 경우 Newtonsoft.Json을 사용하는 것이 좋다.
특히 null 값이 필요한 경우 Newtonsoft.Json이 필수! 🚀

 

 

json을 읽어와서 써야할때 Utility로 하다가 만약 계속 오류가 난다면 Newtonsoft.json으로 바꾸는게 좋다!