유니티

JsonUtility 사용법

파란색까마귀 2022. 2. 15. 16:17

2021. 2. 14. 20:04

https://blog.naver.com/nagne2011/222243276016

 

JsonUtility 사용법

#JsonUtility #유니티 #json #파싱 갑자기 시작하는 JsonUtility 사용방법 서버측과 데이터를 주고받을...

blog.naver.com

 

 

#JsonUtility #유니티 #json #파싱

 

갑자기 시작하는 JsonUtility 사용방법

 

서버측과 데이터를 주고받을때 단순히 텍스트만 나열하는게 아니라

특별한 약속이나 규칙에 따라 주고받는 방법을 많이 쓴다

 

특히 json방식이 대표적인데

복잡한 데이터 텍스트를 json방식으로 직렬화-비직렬화

즉, 조합/분해 방식을 사용하여 대량의 데이터 텍스트를

미리 약속한 대로 주고받을 수 있다

{ 
    rows:
    [
        { 
            gamer_id: { "9bfbcdb0-b35a-11e9-a6af-c35e0b5e70db" },
            gamerInDate: { "2019-07-31T06:15:35.691Z" },
            nickname: { "thebackend" },
            score: { N: 0 },
            rank: { N: 1 },
        },
        { 
            gamer_id: [string], 
            gamerInDate: [string], 
            nickname: [string], 
            score: [Object], 
            rank: [Object]
        }
    ],
    totalCount: 1,          // 랭킹 집계된 전체 갯수
    type: 'RTScore',        // 랭킹에 사용한 테이블 명
    detailType: 'score',    // 랭킹에 사용한 테이블의 컬럼 명
    period:
    {
        // 기간 없음 랭킹의 경우 startDate, endDate가 존재하지 않고 string으로 infinity 표시
        startDate: '2019-08-29T02:36:30.879Z',
        endDate: '2019-08-29T14:59:59.999Z'
    }
}
출처 : https://developer.thebackend.io/unity3d/guide/ranking/rtRanking/GetRTRankByUuid/
(뒤끝서버)
 

이런 방식으로 json규격에 맞춰

클라이언트 -> 서버

서버 <- 클라이언트

데이터를 주고받는다

 

워낙 흔히 쓰이는 방식이라 유니티에서도 해당 json방식의 대한 직렬화/비직렬화를 제공하는데

그게 바로 JsonUtility함수다

사용법은 아래와 같다

 

 

public class JsonTest : MonoBehaviour
{
	private void Start()
	{
		
	}



	string ObjectToJson(object obj)
	{
		return JsonUtility.ToJson(obj);
	}

	T JsonToOject<T>(string jsonData)
	{
		return JsonUtility.FromJson<T>(jsonData);
	}
}
 

직렬화된 클래스를 넣으면 json형식의 텍스트로 바꿔주고,

json형식의 텍스트와 직렬화 클래스를 넣어주면 해당 클래스에 맞게 클래스를 생성해준다

 

이제 테스트로 사용할 데이터 클래스를 만들자

[Serializable]
public class Data
{
	public int i;
	public float f;

	public string str;
	public int[] iArray;
	public List<int> iList = new List<int>();

	public Vector3 vec;

	public Data(int _i, float _f, string _str, int[] _iArray, List<int> _iList, Vector3 _vec)
	{
		i = _i;
		f = _f;
		str = _str;
		iArray = _iArray;
		iList = _iList;
		vec = _vec;
	}
}
 

새로 스크립트를 생성해도 되고, 같은 스크립트 구석에 만들어놔도 된다

 

여기서 중요한건 해당 클래스를 '직렬화'해주는 작업

 

해당 클래스를일반적인 클래스로 사용하는게 아니라 '데이터'로 취급해주기 위해서 진행하는 방식이다

자세한 설명은 아래 링크를 참고

https://m.blog.naver.com/yoohee2018/220724696138

데이터 저장하기 2 (Serialization)

2. Serialization(직렬화) 두번째 방법은 Unity에서 제공하는 Serialization API를 이용하여 바이너...

m.blog.naver.com

 

이제 해당 Data클래스를 사용하여 임의의 데이터를 생성한다음 json으로 변경한다

 

public class JsonTest : MonoBehaviour
{
	private void Start()
	{
		Data temp = new Data(99, 0.5f, "Test", new int[] { 0, 1, 2 }, new List<int> { 0, 0, 1, 1 }, new Vector3 (10, 20, 30));
		string str = ObjectToJson(temp);
		Debug.Log("Json : " + str);

	}

	string ObjectToJson(object obj)
	{
		return JsonUtility.ToJson(obj);
	}

	T JsonToOject<T>(string jsonData)
	{
		return JsonUtility.FromJson<T>(jsonData);
	}
}
 

간략히 설명하자면,

클래스 생성자를 통해 Data클래스를 구성하는 요소를 채운다

그다음 아까 만든 함수를 사용해서 Json으로 변경

 

결과는 아래와 같다

{
  "i": 99,
  "f": 0.5,
  "str": "Test",
  "iArray": [
    0,
    1,
    2
  ],
  "iList": [
    0,
    0,
    1,
    1
  ],
  "vec": {
    "x": 10,
    "y": 20,
    "z": 30
  }
}
 

여기서 눈여겨봐야할껀 array와 list형태가 같다는점

거꾸로본다면 json파일을 가지고 다시 데이터화할때, array와 list중 원하는 방식으로 변경 가능하다는점이다

 

한가지 더 중요시 봐야할 항목은 일반 변수들(int string 등)과 배열 변수의차이점이다

[ ] 대괄호를 이용해서 각 항목들을 구분짓고 하위 항목들은 쉼표로 구분짓는다

 

그리고 Vector3같은 class형태의 변수일 경우

각 항목(x,y,z)마다 어떤 값이 들어있는지 따로 표시된다

위 방식을 응용하면 class형태의 변수들로 데이터 갱신이 가능하다

 

 

이제 이걸 역순으로 데이터화 하자

그전에, 해당 데이터를 그대로 쓰면 재미가 없으니 json값을 조금 변경할 예정이다

이때 주의할건 절대 '형식'은 변경되면 안된다

실제로는 jsonUtility를 통해 변환/조립 되기때문에 형식이 깨질일은 없지만

직업적으로 데이터 조작시 형식에 오류가 날수 있으므로 항상 주의

 

{
  "i": 100,
  "f": 0.9,
  "str": "Testparse",
  "iArray": [
    10,
    20,
    30
  ],
  "iList": [
    9,
    9,
    7,
    7
  ],
  "vec": {
    "x": 100,
    "y": 200,
    "z": 300
  }
}
 
	string parseStr = "{\"i\": 100,\"f\": 0.9,\"str\": \"Testparse\",\"iArray\": [10,20,30],\"iList\": [9,9,7,7],\"vec\": { \"x\": 100, \"y\": 200, \"z\": 300}}";

	Data parse = JsonToOject<Data>(parseStr);

	Debug.Log(string.Format("i:{0}\nf:{1}\nstr:{2}\niArray: {3},{4},{5}\niList: {6}, {7}, {8}, {9}\nVec: {10},{11},{12}",
			parse.i, parse.f, parse.str, parse.iArray[0], parse.iArray[1], parse.iArray[2], parse.iList[0], parse.iList[1], parse.iList[2], parse.iList[3], parse.vec.x, parse.vec.y, parse.vec.z)
			);
 

stirng변수에 아까 수정한 데이터값을 넣고 ("기호 앞에 \를 붙여줘야 string으로 인식한다)

해당 데이터를 json파싱 함수를 사용해서 파싱한다

그리고 새로 생성된 parse의 데이터를 확인해보자

 

i:100
f:0.9
str:Testparse
iArray: 10,20,30
iList: 9, 9, 7, 7
Vec: 100,200,300
 

해결완료!

 

728x90