-
[TIL]C# Json 리스트 저장TIL 2024. 5. 2. 22:15
어제는 단순히 변수만 Json 파일에 불러오고 저장하는 것을 해봤다.
변수 저장과 호출은 해결했지만 리스트나 다른 자료구조를 저장해야 할 때는 어떻게 해야할까?
원래 썼던 코드
더보기static string filePath = "./Save/SaveFile.json"; static public void Save(Player player)//현재는 플레이어 스텟만 저장 { JObject Save = new JObject( new JProperty("playerName", player.name), new JProperty("playerJob", player.job), new JProperty("playerLevel", player.level), new JProperty("playerAttack", player.attack), new JProperty("playerDefense", player.defense), new JProperty("playerHealth", player.health), new JProperty("playerGold", player.gold) ); File.WriteAllText(filePath, Save.ToString());//Save 폴더 안에 json 파일 만들기 }
바꾼코드
더보기public void Save(Player player, int dungeonLevel, Shop shop) { string invenJson = JsonConvert.SerializeObject(player.inven); string shopEquipJson = JsonConvert.SerializeObject(shop.equipment); JObject Save = new JObject(); JArray playerInven = JArray.Parse(invenJson); JArray equipItem = JArray.Parse(shopEquipJson); Save.Add("playerName", player.name); Save.Add("playerJob", player.job); Save.Add("playerLevel", player.level); Save.Add("playerExp", player.exp); Save.Add("playerAttack", player.attack-player.attackBonus); Save.Add("playerAttackBouns", player.attackBonus); Save.Add("playerDefense", player.defense- player.defenseBonus); Save.Add("playerDefenseBonus", player.defenseBonus); Save.Add("playerHealth", player.health-player.healthBonus); Save.Add("playerHealthBonus", player.healthBonus); Save.Add("playerManaPoint", player.manaPoint-player.manaPointBonus); Save.Add("playerManaPointBonus", player.manaPointBonus); Save.Add("playerGold", player.gold); Save.Add("dungeonLevel", dungeonLevel); Save.Add("playerInven", playerInven); Save.Add("shopEquipItem", equipItem); File.WriteAllText(filePath, Save.ToString());//Save 폴더 안에 json 파일 만들기 }
1. Serialize (직렬화)
객체의 상태를 저장할 수 있게 바꾸는 것을 말한다.
Json 파일에 저장하기 위해서 직렬화 하는 과정을 거쳐야한다.
using Newtonsoft.Json;
//SaveLoad.cs string invenJson = JsonConvert.SerializeObject(player.inven); string shopEquipJson = JsonConvert.SerializeObject(shop.equipment);
JsonCovert.SerializeObject
JsonCovert를 사용하여 List 를 string으로 직렬화 한 코드이다.
Json 파일을 열어보면 리스트는 이런식으로 출력된다.
https://learn.microsoft.com/ko-kr/dotnet/standard/serialization/system-text-json/how-to
2. deserialize (역직렬화)
직렬화한 데이터를 원래 데이터 구조로 바꿔준다.
Item item = JsonConvert.DeserializeObject<Item>(data.ToString());
JsonConvert.DeserialzeObject
JsonCovert를 사용하여 string을 Item으로 역직렬화 한 코드이다.
foreach (JToken data in invenJToken) { Item item = JsonConvert.DeserializeObject<Item>(data.ToString()); player.inven.Add(item); }
이런식으로 역직렬화를 통해 인벤토리에 저장한 값을 넣어주었다.
https://learn.microsoft.com/ko-kr/dotnet/standard/serialization/system-text-json/deserialization
3. JToken
JToken invenJToken = jobject["playerInven"]; //인벤토리에서 JToken equipItemJToken = jobject["shopEquipItem"]; //상점에 장착가능 아이템에서
JToken {JToken 이름} = jobject["{찾으려는 값}"];
으로 선언하게되면 JToken 에 해당 값들이 들어간다
즉 예시로 보인 JToken invenJToken에는 위에서 넣어 주었던 playerInven값들(리스트) 값을 가져온다.
이렇게 사용하는 방법이 효율적인지는 잘 모르겠으나
이 방법을 통해서 프로젝트의 정보를 다 저장하고 불러올 수 있었다.
'TIL' 카테고리의 다른 글
[TIL] 게임 특강 (0) 2024.05.07 [TIL] 2024-05-03 팀 프로젝트 마무리 (0) 2024.05.03 [TIL] C# (얇은 복사 깊은 복사, Json 파일 이용하여 저장하기) (1) 2024.05.01 [TIL]2024-04-30 VisualStudio (0) 2024.04.30 [TIL]특강 (C#, 코드컨벤션,깃허브) (0) 2024.04.29