스파르타 게임개발종합반(Unity)/TIL - 본캠프 매일 공부 기록

2024.04.30 TIL - Json 저장용 리스트 클래스 만들기

테크러너 2024. 4. 30.

주의! Unity 혹은 Java에서의 Json이 아니라 C# VisualStudio 환경에서의 Json 내용을 담고있다.

 

  "inventory": {
    "items": [
      {
        "type": 1,
        "isEquipped": true,
        "name": "수련자 갑옷",
        "value": 5,
        "description": "수련에 도움을 주는 갑옷입니다.",
        "isSold": true,
        "price": 1000
      },
      {
        "type": 1,
        "isEquipped": false,
        "name": "오래된 갑옷",
        "value": 2,
        "description": "오래되어서 방어력이 낮은 갑옷입니다.",
        "isSold": true,
        "price": 400
      }
    ]
  }

위의 Json파일에서 items는 리스트이다.

개인과제를 진행했을 당시에 위의 파일에서 보다시피 저장엔 성공했었다.

다만 불러올 때 리스트가 다 비워진 상태로 저장이 됐다.

 

이번에 팀과제를 하면서 한 팀원에게 얻은 지식인데

팀원의 말로는 Json이 리스트를 저장할줄 몰라서 리스트를 클래스로 한 번 감싸주면 저장할 줄 알게 된다고 했다.

그래서 리스트를 클래스형식으로 바꾸기 위해 기존의 C# 코드에서 리스트 구현부분을 가져와서 아래와 같이 코드를 작성하셨다고 했다.

//json 저장용 List<Item> 대체 클래스
public class ItemList
{
	public List<Item> Data { get; private set; }

	public uint Count { get; private set; }

	//Json 저장용 constructor
	[JsonConstructor]
	public ItemList(List<Item> data, uint count)
	{
		this.Data = data;
		this.Count = count;
	}

	public ItemList()
	{
		this.Data = new List<Item>();
		this.Count = 0;
	}

	//기존 List의 Add 메소드를 이 클래스에 맞게 변환
	public void Add(Item item)
	{
		Data.Add(item);
		Count++;
	}

	//기존 List의 Remove 메소드를 이 클래스에 맞게 변환
	public void Remove(Item item)
	{
		Data.Remove(item);
		Count--;
	}

	//기존 List의 Contains 메소드를 이 클래스에 맞게 변환
	public bool Contains(Item item)
	{
		return Data.Contains(item);
	}

	// Sets or Gets the element at the given index.
	// 리스트가 [index]로 가져오는 함수를 가져와서 따라함
	public Item this[int index]
	{
		get
		{
			// Following trick can reduce the range check by one
			if ((uint)index >= (uint)Count)
			{
				throw new IndexOutOfRangeException("Index 범위 초과!!");
			}
			return Data[index];
		}

		set
		{
			if ((uint)index >= (uint)Count)
			{
				throw new IndexOutOfRangeException("Index 범위 초과!!");
			}
			Data[index] = value;
		}
	}
}

 

위의 코드는 기존 List를 구현한 코드인데, `<>` 안에 내가 만든 클래스 자료형을 넣어서 나만의 리스트를 만들게 된 것이다.

그리고 클래스로 한 번 씌워줬으니 Json에 저장이 될 것이다.

 

코드에 사용된 어트리뷰트

`[JsonConstructor]` :  이 어트리뷰트를 생성자 위에 사용하면 JSON에서 객체를 역직렬화할 때 사용할 생성자를 지정할 수 있다. 예를 들어 클래스가 여러 생성자를 가질 때, 어떤 생성자를 JSON 역직렬화에 사용할 것인지를 지정한다.

 

 

반응형

댓글