유니티를하다가 컴퓨터 박살낼뻔 해서 적는글
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으로 바꾸는게 좋다!
'Technology > Computer' 카테고리의 다른 글
| 트위터정도의 서버를 돌리려면 얼마 정도 필요할까? (0) | 2025.04.30 |
|---|---|
| 워드 프레스에서 광고 제거하는 법 (1) | 2025.04.29 |
| chatGPT O3-mini에 대해서 (openAI 사이트) (0) | 2025.03.23 |
| 유니티로 2d 타이쿤 게임 만들때 개발 순서 (0) | 2025.03.15 |
| 코드를 잘 짜는 법에 대해 (0) | 2025.03.12 |