unity Json
Post

unity Json

Json

json 기본구조

정수, 실수, 문자열, 배열, bool, null타입의 데이터 타입 지원

1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
    "id":"wergia",
    "level":10,
    "exp":33.3,
    "hp":400,
    "items":
    [
        "Sword",
        "Armor",
        "Hp Potion",
        "Hp Potion",
        "Hp Potion"
    ]
}

Json은 주석을 지원하지 않기 때문에 Json 검사기를 통해 검사를 하는걸 추천.

유니티가 지원하는 json형태로 데이터 변환


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
        myInfo = new UserInfo();

        myInfo.userName = "강찬희";
        myInfo.age = 20;
        myInfo.height = 186;
        myInfo.gender = false;
        myInfo.favoriteFood = new List<string>();
        myInfo.favoriteFood.Add("피자");
        myInfo.favoriteFood.Add("소");
        myInfo.favoriteFood.Add("돈까스");

        // myInfo 를 Json 형태로 만든다.
        string jsonData = JsonUtility.ToJson(myInfo,true);
        print(jsonData);


data를 json화 시켜주는 메서드. JsonUtility.ToJson(myInfo,true)) JsonUtility.ToJson(myInfo,false)) 로 parsing 하는게 좋다.

Json화 시킨 데이터 파일로 저장

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
  
    // 나의 정보
    public UserInfo myInfo;

     // myInfo 를 Json 형태로 만든다.
            string jsonData = JsonUtility.ToJson(info, true);
            print(jsonData);
            // jsonData를 파일로 저장
            FileStream file = new FileStream(Application.dataPath + "/myInfo.txt", FileMode.Create);

            // json string 데이터를 byte 배열로 만든다.
            byte[] byteData = Encoding.UTF8.GetBytes(jsonData);
            // bydata를 file에 쓰자
            file.Write(byteData, 0, byteData.Length);

            file.Close();


Json화 시킨 데이터 파일로 불러오기.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
            // myInfo.txt를 읽어오자
            FileStream file = new FileStream(Application.dataPath + "/myInfo.txt", FileMode.Open);

            // file의 크기만큼 byte 배열을 할당한다. file.length는 myInfo.txt의 크기와 같다.
            byte[] byteData = new byte[file.Length];
            // byData에 file의 내용을 읽어온다.
            file.Read(byteData,0, byteData.Length);
            // 파일을 닫아주자
            file.Close();

                        // byteData를 문자열로 바꾸자.
            string jsonData = Encoding.UTF8.GetString(byteData);

            // 문자열로 되어있는 jsonData를 myInfo에 parsing 한다. UserInfo 구조체에 맞게.
             myInfo = JsonUtility.FromJson<UserInfo>(jsonData);


예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Text;
using UnityEngine;

// 랜덤하게 만들어지는 오브젝트의 정보
[System.Serializable]
public class ObjectInfo
{
    public int type;
    public Transform tr;
}

[System.Serializable]
public class SaveInfo
{
    public int type;
    public Vector3 pos;
    public Quaternion rot;
    public Vector3 scale;
}

[System.Serializable]
public class JsonList<T>
{
    public List<T> data;
}

public class ObjectSaveLoad : MonoBehaviour
{
    public List<ObjectInfo> objectList = new List<ObjectInfo>();

    private void Update()
    {
        // 1번키 누르면 랜덤한 모양, 크기 위치, 회전이 된 오브젝트 만들자
        if (Input.GetKeyDown(KeyCode.Alpha1))
        {
            // 모양을 랜덤하게 뽑자. (0 - 3) 
            int type = Random.Range(0, 4);

            for (int i = 0; i < 10; i++)
            {

            // type 모양으로 Gameobject 만들자
            GameObject go = GameObject.CreatePrimitive((PrimitiveType)type);

            // 크기 위치 회전 랜덤하게 설정
            go.transform.localScale = Vector3.one * Random.Range(0.5f, 2.0f);
            go.transform.position = Random.insideUnitSphere * Random.Range(1.0f, 20.0f);
            go.transform.rotation = Random.rotation;

            // 만들어진 오브젝트의 정보를 List에 담자.
            ObjectInfo info = new ObjectInfo();
            info.type = type;
            info.tr = go.transform;
            objectList.Add(info);
            }

        }

        // 데이터 저장
        if (Input.GetKeyDown(KeyCode.Alpha2))
        {
            List<SaveInfo> saveInfoList = new List<SaveInfo>();
            // objectList 를 기반으로 저장할 정보를 빼오자
            for (int i = 0; i < objectList.Count; i++)
            {
                SaveInfo saveinfo = new SaveInfo();
                saveinfo.type = objectList[i].type;
                saveinfo.pos = objectList[i].tr.position;
                saveinfo.rot = objectList[i].tr.rotation;
                saveinfo.scale = objectList[i].tr.localScale;

                saveInfoList.Add(saveinfo);

            }
            //saveInfoList를 이용해 JsonData로 만들자.
            JsonList<SaveInfo> jsonList = new JsonList<SaveInfo>();
            jsonList.data = saveInfoList;

            string jsonData = JsonUtility.ToJson(jsonList, true);
            print(jsonData);

            FileStream file = new FileStream(Application.dataPath + "/ObjectInfo.txt", FileMode.Create);

            // json string 데이터를 byte 배열로 만든다.
            byte[] byteData = Encoding.UTF8.GetBytes(jsonData);
            // bydata를 file에 쓰자
            file.Write(byteData, 0, byteData.Length);

            file.Close();
        }

        // 데이터 불러오기
        if (Input.GetKeyDown(KeyCode.Alpha3))
        {
            FileStream file = new FileStream(Application.dataPath + "/ObjectInfo.txt", FileMode.Open);

            // file의 크기만큼 byte 배열을 할당한다. file.length는 myInfo.txt의 크기와 같다.
            byte[] byteData = new byte[file.Length];
            // byData에 file의 내용을 읽어온다.
            file.Read(byteData, 0, byteData.Length);
            // 파일을 닫아주자
            file.Close();

            // byteData를 문자열로 바꾸자.
            string jsonData = Encoding.UTF8.GetString(byteData);
            print(jsonData);

            // JsonData를 이용해서 JsonList에 parsing 하자
            JsonList<SaveInfo> jsonList = JsonUtility.FromJson<JsonList<SaveInfo>>(jsonData);

            // jsonList.data 의 갯수 만큼 오브젝트를 생성하자.
            for (int i = 0; i < jsonList.data.Count; i++)
            {
                // type 모양으로 Gameobject 만들자
                GameObject go = GameObject.CreatePrimitive((PrimitiveType)jsonList.data[i].type);

                // 데이터를 가져와 값을 넣어 준다.
                go.transform.localScale = jsonList.data[i].scale;
                go.transform.position = jsonList.data[i].pos;
                go.transform.rotation = jsonList.data[i].rot;
            }
        }
    }
}