πŸ’Ύμœ λ‹ˆν‹° - JSON 파일둜 κ²Œμž„ μ €μž₯ν•˜κΈ° 1-3 (μ €μž₯ 파일 뢈러였기)

JP KimΒ·2024λ…„ 12μ›” 2일

μœ λ‹ˆνŒ…

λͺ©λ‘ 보기
5/5

μ €λ²ˆμ—λŠ” μœ λ‹ˆν‹°μ—μ„œ κ²Œμž„ 데이터λ₯Ό JSON 파일둜 μ €μž₯ν•΄λ΄€λ‹€.
μ΄λ²ˆμ—λŠ” μ €μž₯ν•œ JSON νŒŒμΌμ„ μœ λ‹ˆν‹°λ‘œ λΆˆλŸ¬μ˜€λŠ” μž‘μ—…μ„ ν•΄λ³΄μž.


1. JSON 파일 역직렬화 (Deserialization)

μ•žμ„  κΈ€μ—μ„œ μš°λ¦¬λŠ” κ²Œμž„ 데이터 객체λ₯Ό JSON ν˜•μ‹μœΌλ‘œ λ³€ν™˜ν•΄λ΄€λ‹€.
근데 이제 μ €μž₯ν•œ JSON νŒŒμΌμ„ μ–΄λ–»κ²Œ 뢈러였고, κ·Έ 파일의 λ‚΄μš©μ„ μ–΄λ–»κ²Œ μ²˜λ¦¬ν•΄μ•Όν• κΉŒ?

객체λ₯Ό JSON 파일둜 λ³€ν™˜μ‹œμΌ°λ˜ κ²ƒμ²˜λŸΌ, JSON νŒŒμΌμ„ ν™œμš©ν•˜κΈ° μœ„ν•΄μ„  이 데이터λ₯Ό λ‹€μ‹œ 객체둜 λ³€ν™˜μ‹œμΌœμ•Όν•œλ‹€. 이λ₯Ό 역직렬화(Deserialization)라 ν•œλ‹€.

λ‹€ν–‰νžˆ μš°λ¦¬κ°€ 썼던 JsonUtilityμ—μ„œ JsonUtility.ToJsonλ©”μ„œλ“œλ₯Ό 톡해 κ°„λ‹¨νžˆ 객체λ₯Ό 직렬화 ν–ˆλ˜ κ²ƒμ²˜λŸΌ 라이브러리 λ‚΄λΆ€μ—μ„œ JsonUtility.FromJson λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•΄μ„œ 역직렬화 κΈ°λŠ₯을 μ‚¬μš©ν•  수 μžˆλ‹€.

그럼 이제 JSON νŒŒμΌμ„ μ—­μ§λ ¬ν™”ν•˜λŠ” μ½”λ“œλ₯Ό μ‚΄νŽ΄λ³΄μž.


2. μ €μž₯된 파일 읽기

string path = Path.Combine(Application.persistentDataPath, "playerData.json");
if (File.Exists(path))
{
    string jsonData = File.ReadAllText(path);
}

λ‹Ήμ—°νžˆ 데이터λ₯Ό 뢈러였러면 νŒŒμΌμ„ λ¨Όμ € 읽어야 ν•œλ‹€. μœ„ μ½”λ“œλ₯Ό 뢄석해보면

  • Path.Combine을 ν†΅ν•΄μ„œ path λ³€μˆ˜μ— κ²½λ‘œκ°’μ„ ν• λ‹Ήν•΄μ€€λ‹€.
  • File.Existsλ₯Ό ν†΅ν•΄μ„œ path κ²½λ‘œμ— 파일이 μ‘΄μž¬ν•˜λŠ”μ§€ ν™•μΈν•œλ‹€.
  • λ§Œμ•½ μ‘΄μž¬ν•œλ‹€λ©΄ File.ReadAllText둜 파일 λ‚΄μ˜ λͺ¨λ“  ν…μŠ€νŠΈμ„ κ°€μ Έμ™€μ„œ jsonData λ³€μˆ˜μ— ν• λ‹Ήν•œλ‹€.

자, 이러면 jsonDataλ³€μˆ˜μ— 파일 내에 있던 λͺ¨λ“  값이 μ €μž₯이 됐닀.
그럼 이제 이 ν…μŠ€νŠΈλ₯Ό μ–΄λ–»κ²Œ μ²˜λ¦¬ν•΄μ•Ό 데이터 객체둜 λ³€ν™˜μ‹œν‚¬ 수 μžˆμ„κΉŒ?


3. 데이터 객체둜 λ³€ν™˜ν•˜κΈ°

PlayerData playerData = JsonUtility.FromJson<PlayerData>(jsonData);

이건 JSON 객체둜 λ³€ν™˜ν•  λ•Œ JsonUtility.ToJson을 μ‚¬μš©ν•œ 것과 μœ μ‚¬ν•˜κ²Œ, JsonUtility.FromJson λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜λ©΄ λœλ‹€.

  • JsonUtility.FromJsonλ₯Ό ν†΅ν•΄μ„œ jsonData에 μ €μž₯된 ν…μŠ€νŠΈ 데이터λ₯Ό PlayerData νƒ€μž…μ˜ 객체둜 λ³€ν™˜ν•œ ν›„, playerData λ³€μˆ˜μ— 값을 μ €μž₯ν•΄μ€€λ‹€.

이러면 데이터λ₯Ό λΆˆλŸ¬μ˜€λŠ” κΈ°λ³Έ 둜직이 끝났닀!

이제 μœ„μ˜ λ‘œμ§μ„ ν•©μ³μ„œ ν•œ μ½”λ“œλ‘œ λ§Œλ“€λ©΄ μ•„λž˜μ²˜λŸΌ μ“Έ 수 μžˆλ‹€.

using System.IO;
using UnityEngine;

[System.Serializable]
public class PlayerData // μ €μž₯ν•  데이터가 λͺ…μ‹œλœ 클래슀
{
    public string name;
    public int level;
    public string[] items;
}

// 데이터 λ‘œλ“œμ™€ κ΄€λ ¨λœ λ©”μ„œλ“œκ°€ μ •μ˜λœ λ§€λ‹ˆμ € 클래슀
public class LoadManager : MonoBehaviour
{
	// JSON νŒŒμΌμ—μ„œ PlayerDataλ₯Ό λΆˆλŸ¬μ™€, λ°˜ν™˜ν•΄μ£ΌλŠ” λ©”μ„œλ“œ
    public PlayerData LoadData()
    {
        string path = Path.Combine(Application.persistentDataPath, "playerData.json");
        if (File.Exists(path))
        {
            string jsonData = File.ReadAllText(path);
            PlayerData data = JsonUtility.FromJson<PlayerData>(jsonData);
            Debug.Log("데이터 λ‘œλ”© 성곡! // ν”Œλ ˆμ΄μ–΄ 이름 : " + data.name);
            return data;
        }
        else
        {
            Debug.LogWarning("μ„Έμ΄λΈŒ νŒŒμΌμ„ 찾을 수 μ—†μŒ!");
            return null;
        }
    }
}

이제 μ•„λž˜μ˜ 예제λ₯Ό ν†΅ν•΄μ„œplayerData.json νŒŒμΌμ„ μ €μž₯ ν›„, λΆˆλŸ¬μ™€λ³΄μž.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TestJson : MonoBehaviour
{
    void Start()
    {
        PlayerData player = new PlayerData // 데이터 객체 생성
        {
            name = "Player1",
            level = 5,
            items = new string[] { "sword", "shield" }
        };

        SaveManager saveManager = new SaveManager(); // SaveManager 객체 생성
        saveManager.SaveData(player); // 데이터 μ €μž₯

        LoadManager loadManager = new LoadManager(); // LoadManager 객체 생성
        PlayerData playerData = loadManager.LoadData(); // 데이터 뢈러였기
        printData(playerData); // 뢈러온 데이터 좜λ ₯
    }

    void printData(PlayerData playerData)
    {
        Debug.Log("name : " + playerData.name);
        Debug.Log("level : " + playerData.level);
        foreach(string item in playerData.items)
            Debug.Log("item : " + item);
    }
}
  • 예제 μ½”λ“œ

  • 데이터가 μ„±κ³΅μ μœΌλ‘œ λΆˆλŸ¬μ™€μ§„ λͺ¨μŠ΅

  • 뢈러온 데이터 객체에 μ €μž₯λ˜μ–΄ μžˆλŠ” κ°’

이걸둜 κ²Œμž„ μ €μž₯ νŒŒμΌμ„ JSON ν˜•μ‹μœΌλ‘œ μ €μž₯ν•˜λŠ” 것에 μ΄μ–΄μ„œ λΆˆλŸ¬μ˜€λŠ” κΈ°λŠ₯κΉŒμ§€ κ΅¬ν˜„ν•΄λ΄€λ‹€.

μœ„μ˜ μ˜ˆμ‹œ μ½”λ“œλ₯Ό μ’€ 더 닀듬은 μ½”λ“œλ₯Ό μ²¨λΆ€ν•˜κ³  글을 λ§ˆμΉ˜κ² λ‹€.

  • try-catch 문을 μ‚¬μš©ν•΄ μ˜ˆμƒμΉ˜ λͺ»ν•œ 였λ₯˜ μ˜ˆμ™Έμ²˜λ¦¬
  • ifλ¬Έ ꡬ문 μ•½κ°„ μˆ˜μ • (λ‘œμ§μ€ 동일함)
using System.IO;
using UnityEngine;

public class LoadManager : MonoBehaviour
{
    public PlayerData LoadData()
    {
        string path = Path.Combine(Application.persistentDataPath, "playerData.json");
        if (!File.Exists(path))
        {
            Debug.LogWarning("μ„Έμ΄λΈŒ νŒŒμΌμ„ 찾을 수 μ—†μŠ΅λ‹ˆλ‹€. λ””ν΄νŠΈ νŒŒμΌμ„ λΆˆλŸ¬μ˜΅λ‹ˆλ‹€.");
            return new PlayerData { name = "DefaultPlayer", level = 1, items = new string[] { } };
        }

        try
        {
            string jsonData = File.ReadAllText(path);
            PlayerData playerData = JsonUtility.FromJson<PlayerData>(jsonData);

            Debug.Log("데이터 λ‘œλ“œ 성곡!");
            return playerData;
        }
        catch (System.Exception e)
        {
            Debug.LogError("JSON νŒŒμΌμ„ λΆˆλŸ¬μ˜€λŠ”λ° 였λ₯˜ λ°œμƒ: " + e.Message);
            return new PlayerData { name = "DefaultPlayer", level = 1, items = new string[] { } };
        }

    }
}
profile
당신을 ν•œ μ€„λ‘œ μ†Œκ°œν•΄λ³΄μ„Έμš”

1개의 λŒ“κΈ€

comment-user-thumbnail
2024λ…„ 12μ›” 3일

try-catchλŠ” μ „ν˜€ 생각 λͺ»ν•˜κ³  μžˆμ—ˆλ„€μš”. 잘 읽고 κ°‘λ‹ˆλ‹€!

λ‹΅κΈ€ 달기