[Unity] JsonUtility를 통해 Json Array를 처리하는 JsonHelper Class 사용하기

박민주·2022년 5월 11일
0

Unity

목록 보기
23/40
post-thumbnail

유니티 JsonUtility의 FromJson 함수만으로는
서버에서 넘어온 Json Array의 데이터를 Parsing하기 어렵다고 한다.

https://stackoverflow.com/questions/36239705/serialize-and-deserialize-json-and-json-array-in-unity
그래서 방법을 찾아보다가 위 링크에서 JsonHelper 클래스를 Get했다..!

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

public static class JsonHelper 
{
    public static T[] FromJson<T>(string json)
    {
        Wrapper<T> wrapper = UnityEngine.JsonUtility.FromJson<Wrapper<T>>(json);
        return wrapper.data;
    }
    
    public static string ToJson<T>(T[] array)
    {
        Wrapper<T> wrapper = new Wrapper<T>();
        wrapper.data = array;
        return JsonUtility.ToJson(wrapper);
    }

    [Serializable]
    private class Wrapper<T>
    {
        public T[] data;
    }    
}

사용할 땐 이런 식으로 코드를 작성하면 된다

var animalData = JsonHelper.FromJson<AnimalDataFromServer>(request.downloadHandler.text);
Debug.Log($"animalData = ${animalData.Length}");

for(int i=0; i < animalData.Length; i++)
{
    Debug.Log($"animalData[i].name = {animalData[i].name}, animalData[i].type = {animalData[i].animalType}");
}

근데 사용해보니 몇 가지 고려해야 할 사항이 있었다.

1. 클라이언트에서 Json Parsing을 위해 만든 클래스의 필드명이 서버에서 보내주는 데이터와 필드명이 같아야 한다

  • 아래 사진은 Postman을 통해 확인한 API에서 반환하는 Json Data

  • 위 필드명을 참고해서 다음과 같이 클래스를 만들었다

  • 이름이 같지 않으면, Null 값으로 들어간다고 한다.

    [System.Serializable]
    public class AnimalDataFromServer
    {
        public string name;
        public int tier;
        public string color;
        public string animalType;
        public string headItem;
        public string bodyItem;
        public string footItem;
        public string pattern;
    }

2. 서버에서 넘겨줄 때 Json Array에서 배열의 이름을 지정해주어야 한다

  • 아래 예시에서 "Items" 처럼 배열의 이름이 있어야 된다
  • 그리고 JsonHelper 클래스의 wrapper.data 등의 부분에서 data 대신 wrapper.Items 와 같이 배열의 이름이 들어가야 한다.
profile
Game Programmer

2개의 댓글

comment-user-thumbnail
2022년 5월 20일

여기도 참고해보세요!!!
https://github.com/LitJSON/litjson

1개의 답글