Log to grow

[Unity] 클래스를 Json으로 저장, 불러오기(Json.NET) 본문

Game/Unity

[Unity] 클래스를 Json으로 저장, 불러오기(Json.NET)

kkkrrr 2020. 1. 24. 18:49

 

유니티 에셋스토어에서 제공하는 Json.NET을 이용하면 클래스 형태의 데이터를 Json 형태로 쉽고 빠르게 저장하고 불러올 수 있다. 아래와 같은 클래스를 파일로 저장하고 불러온다고 해보자.

 

class Human{
    public int age = 28;
    public string name = "John";
    public float height = 173.0f;
}

 

1. 멍청한 방법

Json.NET을 이용하는 이점이 없어지는 아주 비효율적인 방법이다. 비효율적인 방법을 소개하는 이유는 내가 꽤 오랫동안 이렇게  잘못된 방법으로 Json을 만들었기 때문이다... 이러한 실수가 궁금하지 않다면 바로 2번으로 넘어가야 한다.

 

1. Json Object 생성

Human human; // 필드의 값이 입력되었다고 가정

JObject j = new JObject();

j["age"] = human.age;
j["name"] = human.name;
j["height"] = human.height;

Json Object를 생성한 후 각 key 값을 지정하여 각 필드의 값을 일일히 넣어준다.

 

2. 생성한 Json Object를 파일로 저장

File.WriteAllText(Application.persistentDataPath + "/data.json", j.ToString(Formatting.None));

생성된 Json Object를 string으로 변환하여 파일로 저장한다.

 

3. 불러오기

string data = File.ReadAllText(Application.persistentDataPath + "/data.json");
json = JObject.Parse(data);

Human human = new Human();
human.age = json["age"];
human.name = json["name"];
human.height = json["height"];

파일의 텍스트를 그대로 읽어와서 Json Object로 변환한다. 그 후 클래스를 생성하고 각 필드에 값을 넣어준다.

 

사실 그렇게 복잡한 코드가 아니기 때문에 꽤 괜찮은 방법이라고 오해할 수 있지만 처리하고자 하는 클래스의 모양이 조금이라도 복잡해지면 매우 비효율적인 방법이라는 것을 알 수 있다. 만약 클래스에 Dictionary가 포함되어 있다면? 해당 Dictionary의 모든 요소를 돌며 Json Object로 만들고 이를 파일에 저장한 후 불러올 때에도 이 Json Object를 Dictionary로 변환해주어야 한다...

 

2. 똑똑한 방법

사실 위에서 했던 모든 과정은 Json.NET이 알아서 해준다. 라이브러리를 사용하고자 한다면 해당 라이브러리가 제공하는 기능들을 숙지하고 사용하자(급 교훈)

 

1. 클래스를 파일로 저장

Human human = new Human();
string jsonString = JsonConvert.SerializeObject(human);
File.WriteAllText(Application.persistentDataPath + "/data.json", jsonString);

 

SerializeObject라는 메서드를 활용하면 객체를 바로 Json string으로 만들어준다. 생성된 string을 바로 파일로 저장해주기만 하면 된다. 해당 코드로 저장된 json 파일은 아래와 같다.

 

{"age":28,"name":"John","height":173.0}

 

2. 파일을 불러와 클래스로 저장

string data = File.ReadAllText(Application.persistentDataPath + "/data.json");
Human human = JsonConvert.DeserializeObject<Human>(data);

파일을 불러온 후에도 DeserializeObject 메서드를 이용하여 string을 바로 클래스로 deserialize 해준다. 주의해야할 점은 Generic 메서드 이므로 타입을 명시해주어야 한다.

Comments