반응형

 

 

 

 

JsonUtility

- 유니티에서 제공하는 JSON 클래스이다.

- 다른 JSON 라이브러리에 비해 기능이 적지만 성능이 좋다.

- 직렬화된 클래스, 구조체만 지원되고 배열, 리스트, 딕셔너리 등의 자료구조는 클래스로 래핑해야 JSON 변환이 가능하다.

 

 

 

직렬화(Serializable)

- C#은 복합 데이터 형식을 쉽게 스트림에 읽기/쓰기를 할 수 있게 하는 직렬화라는 메커니즘을 제공한다.

- 직렬화는 객체의 상태(필드에 저장된 값들)를 메모리에 저장 장치에 저장이 가능한 0과 1의 순서로 바꾸는것을 말한다.

- 직렬화는 원하는 데이터 위에 [Serializable] 어트리뷰트를 작성해주면 된다.

 

 

 

using System;
using UnityEngine;

public struct SomeStruct
{
    [SerializeField]
    private int m_iNum;
    [SerializeField]
    private bool m_bCheck;
    
    public SomeStruct(int i, bool b)
    {
        m_iNum = i;
        m_bCheck = b;
    }
}

//ToJson
SomeStruct ss = new SomeStruct(10, false);
string json = JsonUtility.ToJson(ss, true);

//FromJson
SomeStruct ss2 = JsonUtility.FromJson<SomeStruct>(json);
  • JSON으로 변환 할 클래스나 구조체를 반드시 직렬화 어트리뷰트를 작성해줄 필요는 없지만, 해당 클래스나 구조체가 다른 클래스의 멤버가 되면 반드시 직렬화 어트리뷰트를 작성해줘야한다.
  • 멤버 변수의 접근 지시자를 private로 할 경우 [SerializeField] 어트리뷰트를 붙여줘야 해당 데이터가 JSON으로 변환된다.
  • static, readonly, const 키워드가 붙은 멤버 데이터는 JSON으로 변환되지 않는다.
  • JSON으로 변환하지 못하게 할 멤버는 [NonSerialized] 어트리뷰트를 붙여준다.
  • FromJsonOverwrite(json, object)는 추후 작성할 예정(기능 파악 중..)

 

※※ 직렬화 클래스(혹은 구조체)에 멤버변수가 추가된 경우, 해당 멤버변수에 대한 에러가 발생하지 않고 기본값으로 초기화된다.

 

 

 

래핑 클래스

- 배열이나 리스트 등의 자료구조는 API에 직접 전달하는 기능은 지원되지 않기 때문에, 클래스나 구조체로 래핑 해서 변환한다.

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

public static class JsonWrapper
{
    #region ARRAY WRAPPER
    [Serializable]
    private class ArrayWrapper<T>
    {
        [SerializeField]
        private T[] m_items;
        public T[] Items { get { return m_items; } }
        public ArrayWrapper(T[] arr)
        {
            m_items = arr;
        }
    }

    public static string ToJson<T>(T[] array, bool prettyPrint = false)
    {
        ArrayWrapper<T> wrapper = new ArrayWrapper<T>(array);
        //bool : 출력 제어 (로그 출력 시, 보기 좋게 출력하는 기능 지원. default : false)
        return JsonUtility.ToJson(wrapper, prettyPrint);
    }

    public static T[] ArrayFromJson<T>(string json)
    {
        ArrayWrapper<T> wrapper = JsonUtility.FromJson<ArrayWrapper<T>>(json);
        return wrapper.Items;
    }
    #endregion

    #region LIST WRAPPER
    [Serializable]
    private class ListWrapper<T>
    {
        [SerializeField]
        private List<T> m_list;
        
        public List<T> ToList()
        {
            return m_list;
        }

        public ListWrapper(List<T> list)
        {
            m_list = list;
        }
    }

    public static string ToJson<T>(List<T> list, bool prettyPrint = false)
    {
        ListWrapper<T> wrapper = new ListWrapper<T>(list);
        return JsonUtility.ToJson(wrapper, prettyPrint);
    }

    public static List<T> ListFromJson<T>(string json)
    {
        ListWrapper<T> wrapper = JsonUtility.FromJson<ListWrapper<T>>(json);
        return wrapper.ToList();
    }
    #endregion
}
  • Dictionary 역시 위와 같은식으로 래핑 클래스를 정의해야한다.

 

 

 

참고

 

JSON 직렬화 - Unity 매뉴얼

JSON 직렬화는 오브젝트와 JSON 포맷을 상호 변환하는 기능입니다. 이 기능은 웹 서비스와 상호작용할 때 유용하거나 단순히 데이터를 텍스트 기반 포맷으로 간편하게 패킹하고 언패킹하는 데 유

docs.unity3d.com

 

 

스크립트 직렬화 - Unity 매뉴얼

직렬화는 데이터 구조나 오브젝트 상태를 Unity 에디터가 저장하고 나중에 재구성할 수 있는 포맷으로 자동으로 변환하는 프로세스를 말합니다. Unity 에디터에서는 저장 및 로딩, 인스펙터 창, 인

docs.unity3d.com

 

 

 

 

 

반응형

+ Recent posts