상세 컨텐츠

본문 제목

Unity에서 JSON 사용하기 ( unity for json )

Development/Unity3D

by Komastar.Dev 2018. 7. 12. 14:15

본문

반응형

유니티 엔진에서 json 사용하기.



우선 유니티를 실행.



Asset Store를 열고



검색어로 json을 입력하여 검색




JSON .NET for Unity 를 찾아서 클릭




에셋을 다운로드 하고



불러오기를 눌러서 프로젝트에 추가



프로젝트에 추가가 완료되면

JsonDotNet이라는 폴더가 생성되어 있을 것이다.



간단한 스크립트를 만들어서 테스트 해보면 된다.

스크린샷은 여기까지만 사용하고 아래에 나올 코드를 참고하도록 하자.

해당 json 라이브러리에 대한 자세한 설명은 newtonsoft 공식 홈페이지를 참조 할 것.

간단한 설명은 에셋을 받으면서 생긴 "JsonDotNet" 폴더 안에 Documentation 폴더에 pdf 파일 참조.

주로 사용할 법한 내용만 요약하는게 이 글의 목적이다.




using System.IO;
using System.Collections.Generic;

using UnityEngine;

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

public class JsonSaveLoad : MonoBehaviour
{
    public void Save()
    {
        //  key-value 사용
        JObject savedata = new JObject();       //  JObject 인스턴스 생성
        savedata["key-name"] = "value-data";    //  key-value 삽입
        savedata["anyname"] = 1f;               //  int, float, string
        savedata["is-save"] = true;             //  bool 등 다양한 자료형 사용 가능

        //  json에서 배열 사용하기
        JArray arraydata = new JArray();        //  JArray 인스턴스 생성
        for (int i = 0; i < 5; i++)
        {
            //  랜덤한 값을 추가한다.
            //  C++에서 사용하는 vector의 push_back과 같다고 보면 된다.
            arraydata.Add(Random.Range(0.0f, 10.0f));
        }
        savedata["arraydata"] = arraydata;      //  위에서 만든 JArray를 대입.

        //  다른 방법으로 JArray 사용하기
        savedata["newarr"] = new JArray();      //  새로운 key에 value로 JArray 할당.
        for (int i = 0; i < 5; i++)
        {
            ((JArray)savedata["newarr"]).Add(Random.Range(0, 50));  //  JArray 변수를 만들어서 축약 가능
        }

        //  json 형식을 value로 사용하기
        savedata["parent"] = new JObject();     //  key를 지정하고 value에 new JObject()를 대입.
        savedata["parent"]["child1"] = 123;
        savedata["parent"]["child2"] = 456;
        
        //  class를 json으로 변환하기
        SaveData s = new SaveData();    //  인스턴스화 시키고 적당히 데이터를 입력.
        s.id = 0;
        s.namelist.Add("komastar");
        s.namelist.Add("kintaro");
        savedata["class-savedata"] = JToken.FromObject(s);  //  파싱.
        
        //  파일로 저장
        string savestring = JsonConvert.SerializeObject(savedata, Formatting.Indented);     //  JObject를 Serialize하여 json string 생성
        File.WriteAllText(Application.persistentDataPath + "/savedata.json", savestring);   //  생성된 string을 파일에 쓴다
    }

    public void Load()
    {
        //  불러오기는 저장의 역순
        string loadstring = File.ReadAllText(Application.persistentDataPath + "/savedata.json");    //  string을 읽음
        JObject loaddata = JObject.Parse(loadstring);   //  JObject 파싱

        //  key 값으로 데이터 접근하여 적절히 사용
        Debug.Log("key-value 개수 : " + loaddata.Count);

        Debug.Log("----------------------------");
        
        Debug.Log(loaddata["class-savedata"]);

        Debug.Log("----------------------------");

        JArray loadarray = (JArray)loaddata["arraydata"];
        for (int i = 0; i < loadarray.Count; i++)
        {
            Debug.Log(loadarray[i]);
        }

        Debug.Log("----------------------------");

        foreach (var item in loaddata["newarr"])
        {
            Debug.Log(item);
        }

        Debug.Log("----------------------------");

        Debug.Log(loaddata["newarr"]);
    }
}

public class SaveData
{
    //  변수 이름이 key값으로 사용된다.
    public int id;

    [JsonProperty("name-list")]     //  프로퍼티 이름을 지정하면 변수 이름 대신 key값으로 사용된다.
    public List namelist;   //  "namelist" : {} 대신 "name-list" : {} 으로 사용됨.

    public SaveData()
    {
        id = 0;
        namelist = new List();
    }
}

/*
{
    "key-name": "value-data",
    "anyname": 1.0,
    "is-save": true,
    "arraydata": [
        3.138103,
        6.43384361,
        0.0607228279,
        5.9034543,
        6.343808,
        0.208146572,
        6.17789,
        8.661151,
        9.782631,
        4.389159
    ],
    "newarr": [
        0,
        29,
        0,
        34,
        26
    ],
    "parent": {
        "child1": 123,
        "child2": 456
    },
    "class-savedata": {
        "id": 0,
        "name-list": [
            "komastar",
            "kintaro"
        ]
    }
}
*/

반응형