유니티 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}");
}
근데 사용해보니 몇 가지 고려해야 할 사항이 있었다.
아래 사진은 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;
}
wrapper.data
등의 부분에서 data 대신 wrapper.Items
와 같이 배열의 이름이 들어가야 한다.
여기도 참고해보세요!!!
https://github.com/LitJSON/litjson