Pink Transparent Star

Unity/개념 공부

[ 내일배움캠프 ] TIL.04 - Json 파일 파싱

채유나 2024. 4. 18. 21:02
728x90

 

해당 내용은 내가 담당했던 부분 중 데이터 저장 후 점수 표출하기 부분에 대한 내용을 다뤄보고자 한다.

 

PlayerPrefs를 이용해서 간단하게 접근이 가능했었겠지만 많이 사용해봤던 PlayerPrefs가 아닌 Json을 사용하고싶은 욕심으로.. 한번 시도 해보게 되었다.

 

데이터를 관리하는 부분은 담당한 적이 없어 Json을 사용한 적이 없어 이해하는데 어려움을 느꼈었는데 이번 계기로 정리하면서 많은 부분을 알 수 있어서 좋았다.

 

Json 어떻게 하는건데..!

 

 

Json (JavaScript Object Notation)

🔸 데이터를 저장하거나 전송할 때 많이 사용하는 경량의 DATA 교환 형식
🔸 정보를 저장할 수 있는 파일 형식으로 용량이 작음 XML의 느린 속도를 개선하기 위해 만들어짐.
🔸 서버와 연결되거나 할땐 Json으로 저장하는 것이 서버와 연결할 때 좋다.

🔸 서버와 클라이언트간의 교류에서 일반적으로 많이 사용

 

💡  경량의  DATA 교환 형식

속성 - 값 || 키 - 값 쌍으로 이루어진 데이터 오브젝트를 전달하기 위해 인간이 읽을 수 있는 텍스트를 사용하는 개방형 표준 포맷

 

Unity - Scripting API: JsonUtility

Success! Thank you for helping us improve the quality of Unity Documentation. Although we cannot accept all submissions, we do read each suggested change from our users and will make updates where applicable. Close

docs.unity3d.com

 

JSON 직렬화 - Unity 매뉴얼

JsonUtility 클래스를 사용하여 Unity 오브젝트를 JSON 포맷으로 상호 전환할 수 있습니다. 예를 들어 JSON 직렬화를 사용하여 웹 서비스와 상호작용하거나, 데이터를 텍스트 기반 포맷으로 쉽게 패킹

docs.unity3d.com

 

 

네임스페이스

 : 파일과 디렉터리 관련 네임스페이스

using System.IO;

 

Data의 구조

[Serializable] 
public class GameData
{
    public int stageLevel;
    public float maxScore;
    public bool HardOn = false;
}

직렬화된 데이터 스크립트

 

Json Load

public GameData gameData;

public void LoadGameData()
{
	string filePath = Path.Combine(Application.dataPath, gameDataFileName);
	if (File.Exists(filePath)) //파일 존재 여부 확인
	{
		string fromJsonData = File.ReadAllText(filePath);
		gameData = JsonUtility.FromJson<GameDataInfor>(fromJsonData);
		Debug.Log("Data Load Complete");
	}
}

 

Path.Combine (string, string) : 두개의 경로 문자열을 연결

File.Exists("파일경로") : 지정된 파일이 존재하는지 확인

File.ReadAllText : 텍스트 파일을 열고 파일의 모든 텍스트를 문자열로 읽은 후 파일을 닫음

JsonUtility.FromJson<T>(string json) : Json 포맷의 문자열을 T타입의 인스턴스로 리턴, 객체로 역질렬화

 - GameDataInfor의 멤버들은 반드시 public 하거나 [ SerializeField ]으로 해야지 저장이 가능

 

Json Save

 public void SaveGameData() 
 {   
     string toJsonData = JsonUtility.ToJson(gameData, true);
     string filePath = Path.Combine(Application.dataPath, gameDataFileName);

     File.WriteAllText(filePath, toJsonData); // 이미 저장된 파일이 있는 경우 덮어쓰기

     Debug.Log("Data Save Complete");
 }

 

JsonUtility.ToJson(object , bool) : 인수로 넘긴 객체를 직렬화된 Json 포맷의 String 텍스트으로 리턴

⭐ Json은 직렬화하여 저장되는 포맷  ➨ 인수로 넘긴 객체는 직렬화 가능한 객체여야함

File.WriteAllText(경로, json) : 새파일을 만들고 파일에 내용을 쓴 다음 파일을 닫음. 대상 파일이 있는 경우 덮어써버림

 

나중에 알게된 사실이지만 해당 방법을 이용하면 하나의 데이터의 정보만 저장하기 때문에 2개의 스테이지가 있는 현재 게임해서는 해당이 다른 저장 후 로드 하는 방식을 사용해야하는것을 알게 되었다.

Joson을 담을 배열 추가

[Serializable]
public class GameDataInfor
{
    public GameData[] StageInfor;
}

 

GameData를 배열로 선언하기 위해 GameDataInfor의 직렬화한 클래스를 추가한 후 Json 파일을 파싱 할 때 GameData로 파싱했다면 GameDataInfor로 클래스를 변경해주었다.

 public GameDataInfor gameData;

 

 

참고 사이트

 

Unity C# > UnityEngine : JsonUtility

공부하면서 알게된 것만 정리합니다.😀

ansohxxn.github.io

 

[유니티 C# 강좌] 24. 파일 입출력

1. 파일 입출력 클래스 파일과 디렉터리 관련 네임스페이스로 System.IO가 있습니다. 네임 스페이스 using System.IO; 1.1 파일 및 디렉터리 다음은 주요 파일 및 디렉터리 클래스입니다. 클래스 내용 File

coderzero.tistory.com

 

[IT용어] JSON(JavaScript Object Notation)

JSON(JavaScript Object Notation) 개념 경량(Lightweight)의 DATA-교환 형식이다. 경량(Lightweight)의 DATA-교환 형식~ 경량(Lightweight)의 DATA-교환 형식~~!! 속성-값 쌍 || 키-값 쌍으로 이루어진 데이터 오브젝트를 전

java119.tistory.com

 

728x90