=======================
=======================
=======================
출처: http://dolphin.ivyro.net/file/mobile/unity_util/tutorial04.html
JsonUtility
유니티 5.3 이상부터 JsonUtility를 지원한다. 외부 JSON 라이브러리가 필요 없다. < JsonUtility 멤버 함수 >
1. 기본 사용법Enemy에서는 public을 사용하지 않고 SerializeField를 이용했다.코드가 복잡하지 않기 때문에 자세한 설명은 생략한다. using UnityEngine;
using System; using System.Collections.Generic; [Serializable] public class Enemy { [SerializeField] string name; [SerializeField] List<string> skills; public Enemy(string name, List<string> skills) { this.name = name; this.skills = skills; } } //Test string jsonStr = JsonUtility.ToJson(new Enemy("오거", new List<string>() { "물리공격", "마법" })); Debug.Log(jsonStr); Enemy enemy0 = JsonUtility.FromJson<Enemy>(jsonStr); Enemy enemy1 = new Enemy("empty", new List<string>() { }); JsonUtility.FromJsonOverwrite(jsonStr, enemy1); 결과) jsonStr의 출력 결과는 다음과 같다. {"name":"오거","skills":["물리공격","마법"]} enemy1 값이 오거, 물리공격, 마법으로 변경된다. 2. List 직렬화다음과 같이 List를 Json으로 변환하면 빈 문자열만 변환한다. var enemies = new List<Enemy>();
enemies.Add(new Enemy("오거", new List<string>() { "물리공격", "마법" })); enemies.Add(new Enemy("트롤", new List<string>() { "공격", "회복", "부활" })); string emptyStr = JsonUtility.ToJson(enemies); List는 별도로 직렬화 시켜 주어야 한다. [Serializable]
public class Serialization<T> { [SerializeField] List<T> target; public List<T> ToList() { return target; } public Serialization(List<T> target) { this.target = target; } } //Test var enemies = new List<Enemy>(); enemies.Add(new Enemy("오거", new List<string>() { "물리공격", "마법" })); enemies.Add(new Enemy("트롤", new List<string>() { "공격", "회복", "부활" })); string str = JsonUtility.ToJson(new Serialization<Enemy>(enemies)); Debug.Log(str); List<Enemy> retEnemies = JsonUtility.FromJson<Serialization<Enemy>>(str).ToList(); 결과) str의 출력 결과는 다음과 같다. {"target":[{"name":"오거","skills":["물리공격","마법"]},{"name":"트롤","skills":[" 공격","회복","부활"]}]} retEnemies에 값을 넣는다. 3. Dictionary 직렬화[Serializable]
public class Serialization<TKey, TValue> : ISerializationCallbackReceiver { [SerializeField] List<TKey> keys; [SerializeField] List<TValue> values; Dictionary<TKey, TValue> target; public Dictionary<TKey, TValue> ToDictionary() { return target; } public Serialization(Dictionary<TKey, TValue> target) { this.target = target; } public void OnBeforeSerialize() { keys = new List<TKey>(target.Keys); values = new List<TValue>(target.Values); } public void OnAfterDeserialize() { var count = Math.Min(keys.Count, values.Count); target = new Dictionary<TKey, TValue>(count); for (var i = 0; i < count; ++i) { target.Add(keys[i], values[i]); } } } //Test var enemies = new Dictionary<int, Enemy>(); enemies.Add(1000, new Enemy("오거", new List<string>() { "물리공격", "마법" })); enemies.Add(1001, new Enemy("트롤", new List<string>() { "공격", "회복", "부활" })); string str = JsonUtility.ToJson(new Serialization<int, Enemy>(enemies)); Debug.Log(str); Dictionary<int, Enemy> retEemies = JsonUtility.FromJson<Serialization<int, Enemy>>(str).ToDictionary(); 결과) str의 출력 결과는 다음과 같다. {"keys":[1000,1001],"values":[{"name":"오거","skills":["물리공격","마법"]}, {"name":"트롤","skills":["공격","회복","부활"]}]} ISerializationCallbackReceiver로 직렬화 기능확장Unity 5.3에서 "UnityEngine.ISerializationCallbackReceiver"가 추가 되었다.ISerializationCallbackReceiver를 상속하면 직렬화(ToJson)전에 OnBeforeSerialize가 호출되고 역직렬화(FromJson)전에 OnAfterDeserialize가 호출된다. public class Character : ISerializationCallbackReceiver
{ public void OnBeforeSerialize () { Debug.Log ( "OnBeforeSerialize" ); } public void OnAfterDeserialize () { Debug.Log ( "OnAfterDeserialize" ); } } 참조) http://kou-yeung.hatenablog.com/entry/2015/12/31/014611 https://docs.unity3d.com/ScriptReference/JsonUtility.html https://docs.unity3d.com/ScriptReference/ISerializationCallbackReceiver.html |
=======================
=======================
=======================
출처: https://debuglog.tistory.com/36
유니티 5.3버전부터 JSON 포맷의 데이터를 파싱할 수 있는 API가 추가되었다. 플러그인을 추가하지않고, 내장된 API로만 구현을 하는 게 좋겠다싶어 조금 알아봤지만 만족스럽진 않았다.
일단 예제를 만들어서 테스트해보자.
준비1
Serialize할 수 있는 간단한 데이터 포맷 클래스를 만든다.
[Serializable] public class PlayerInfo { public string name; public int lives; public float strength; }
준비2
JsonHelper 클래스를 따로 만들어준다. JsonUtility의 가장 큰 단점이 배열을 받을 수 없다는 것인데 다음과 같이 JsonObject를 감싸는(JsonObject 배열을 가지는) Wrapper 클래스를 따로 만들어서 문제를 해결할 수 있다.
public static class JsonHelper { public static T[] FromJson<T>(string json) { Wrapper<T> wrapper = JsonUtility.FromJson<Wrapper<T>>(json); return wrapper.items; } public static string ToJson<T>(T[] array) { Wrapper<T> wrapper = new Wrapper<T>(); wrapper.items = array; return JsonUtility.ToJson(wrapper); } public static string ToJson<T>(T[] array, bool prettyPrint) { Wrapper<T> wrapper = new Wrapper<T>(); wrapper.items = array; return JsonUtility.ToJson(wrapper, prettyPrint); } [Serializable] private class Wrapper<T> { public T[] items; } }
테스트 코드
using UnityEngine; using UnityEditor; using System; using System.IO; using System.Collections.Generic; public class JsonTestWindow : EditorWindow { [MenuItem("JSON/Test 1")] static void Init() { JsonTestWindow window = (JsonTestWindow)EditorWindow.GetWindow(typeof(JsonTestWindow)); window.Show(); } void OnGUI() { if (GUILayout.Button ("Save")) { Save (); } if (GUILayout.Button ("Load")) { Load (); } } void Save() { //...아래에서 } void Load() { //...//아래에서 } }
Save()
void Save() { PlayerInfo[] playerInfo = new PlayerInfo[2]; playerInfo[0] = new PlayerInfo(); playerInfo[0].name = "12341234"; playerInfo[0].lives = 5; playerInfo[0].strength = 25.0f; playerInfo[1] = new PlayerInfo(); playerInfo[1].name = "1235235"; playerInfo[1].lives = 3; playerInfo[1].strength = 30.2f; string toJson = JsonHelper.ToJson(playerInfo, prettyPrint:true); File.WriteAllText (Application.dataPath + "/Saves/data.json", toJson); }
Load()
void Load() { string jsonString = File.ReadAllText (Application.dataPath + "/Saves/data.json"); var data = JsonHelper.FromJson <PlayerInfo>(jsonString); foreach (var playerInfo in data) { Debug.Log (playerInfo.name); Debug.Log (playerInfo.lives); Debug.Log (playerInfo.strength); } }
편의를 위해서 EditorWindow로 테스트 해보았다.
별다른 플러그인 없이 쉽게 구현이 가능하다는 장점이 있지만, 인덱싱이 안되고 데이터포맷을 미리 알지못하면 처리할 수 없다는 문제가 있으므로 간단한 데이터 저장용 외에는 활용하기 어려울 것 같다.
=======================
=======================
=======================
출처: https://iw90.tistory.com/62
Unity Json Parser 사용하기
안녕하세요. 이번 포스트는 Unity 에서 Json Parser 이용하는 방법에 대해서 포스트를 써보겠습니다 . c# 에서는 기본 적으로 xml 은 지원하지만 Json은 지원하지 않는다고 합니다 . 그래서 외부 라이브러리를 다운받아 import 해주어야 합니다 . 라이브러리 다운로드 위링크를 통해 접근 하면 LitJson 을 다운 받을수 있는 사이트가 나타 납니다. 저 링크를 통해 다운로드 하면 알집을 다운로드 할 수 있습니다 . litjson-0.7.0 > bin 경로에 들어가면 라이브러리를 확인 할 수 있습니다 . 이제 저 파일을 Unity 프로젝트로 이동시키면 됩니다 . Unity 프로젝트 에 Plugins 폴더를 생성후에 그안에 라이브러리를 넣어 주시면 되겠습니다 .
사용하실 스크립트 파일 상단에 using 을 통해 라리브러리를 사용하겠다는 것을 명시 합니다 .
제가 사용한 전체 코드입니다 . 부분 설명을 해보겠습니다. 우선 제가 Json 을 보고 사용한 예제 입니다 . ok , messgae , data [ message ] 이형태로 json을 만들었습니다 .
이부분이 핵심 코드 입니다 . JsonData jsonPlayer = JsonMapper.ToObject(jsonString); jsonString 을 JsonData로 Converter 를 진행합니다 . 진행후에 string isOk = jsonPlayer [ "ok"].ToString(); JsonData . 을 통해서 해당 Key 값을 입력하면 데이터를 받아 올수 있습니다 . 두댑스의 경우에는 jsonPlayer[ "data"][ "message"] 이와같이 뒤쪽으로 두번째 댑스의 Key 값을 넣어 주면 되겠습니다 . 굉장히 간단하게 Json을 파싱할수 있는것 같습니다 . P.S 저가 조금 헤맨 부분이 있어서 다른분들은 그러지 않을수 있도록 간단한 글 남겨 보겠습니다 . jsonPlayer [ "ok"] 저는 위 코드가 String 으로 반환이 되는 줄 알고 계속 String 으로 접근하였는데 그렇지 않아 뒤쪽으로 ToString 을 붙어주어야 String 으로 사용 할 수 있습니다 . |
출처: https://iw90.tistory.com/62 [woong's]
=======================
=======================
=======================
출처: https://bikim0108.tistory.com/38
출처: https://bikim0108.tistory.com/38 [신에게 영광이 있기를]
=======================
=======================
=======================
출처: https://pjc0247.tistory.com/32
Unity 5.3 버전에서의 변경 사항 중에는 JSON API의 추가가 포함되어 있습니다. (http://blogs.unity3d.com/kr/2015/12/08/unity-5-3-all-new-features-and-more-platforms/)
이전 버전의 유니티에서는 JSON을 사용하려면 외부 라이브러리를 사용하여야 했는데,
각각의 JSON 라이브러리는 iOS/IL2CPP와 호환이 좋지 않은 것들도 있었으며, 게임에 추가한 외부 플러그인에서 JSON 라이브러리를 사용하는 경우도 있어 실제 게임 앱은 하나인데 그 안에 JSON 라이브러리만 2~3종류가 들어가있는 경우도 종종 있었습니다.
유니티에서는 아마 이러한 문제점들을 파악하고 이를 위한 해결책으로 Unity 자체적으로 JSON 라이브러리를 제공하게 된 것 같습니다.
유니티의 새로운 API인 Json Utility는 매우 쓰기 쉽고 기본적인 기능만 제공하지만 게임에서 쓰기에는 기능이 충분합니다. 여기서는 간단한 JsonUtility의 사용법들을 알아보도록 하겠습니다.
이렇게 게임에서 사용하는 세이브 데이터 등을 Json으로 저장할 수 있습니다.
주의할점은 public field만 변환됩니다. public property는 변환되지 않습니다.
제너릭으로 오브젝트의 타입을 지정합니다. Dictionary<string, object> 타입은 동작하지 않는 것 처럼 보입니다.
출처: https://pjc0247.tistory.com/32 [pjc0247]
=======================
=======================
=======================
출처: https://usroom.tistory.com/entry/Unity-json-%ED%8C%8C%EC%8B%B1
Unity json 파싱
외부 텍스트 파일을 불러 와야 할일이 있어서 XML을 살펴봣는데 생각보다 예외 상황도 많은듯하고, 복잡했습니다. @..@;;
제겐 어렵네요... 구조 파악도 잘안되고.. 어휴...
결국 조금더 편리하다는 json으로 다시 살펴봤고 일단 구현은 했습니다.
배열구조로 가야하나 했지만 제가 만들려는 것이 배열구조와는 맞지 않아 key : value 로만 구성했습니다.
힘드네요. ㅋㅋ
가장 심플한 기본 코드만 작성해 봤습니다.
json 파일을 불러와 ngui Labal에 text를 찍는 과정입니다.
-Litjson.dll 넣기-
Litjson.dll 파일을 유니티에 Plugins폴더에 넣어 주셔야 합니다.
-json파일 구조(key : value)-
{
"key" : "value",
"key" : "value",
"key" : "value"
}
-json 예제 파일-
메모장을 열고 아래처럼 적고 유니티에 넣으세요.(txt)
{
"Lines_00":"멍멍멍"
}
-C# 예제 코드-
using UnityEngine;
using System.Collections;
using LitJson;
using System;
public class LoadLines : MonoBehaviour {
public TextAsset JsonFile;
public GameObject Lines_00;
private string Out_Lines_00;
void Awake(){
LitJson.JsonData getData = LitJson.JsonMapper.ToObject(JsonFile.text);
Out_Lines_00 = getData["Lines_00"].ToString();
Lines_00.GetComponent<UILabel>().text = Out_Lines_00;
}
}
출처: https://usroom.tistory.com/entry/Unity-json-파싱 [어른이의 공부방]
=======================
=======================
=======================
출처: http://tedhome.woobi.co.kr/?p=393
[Unity3D] JSONObject 다운로드 & 사용법
이전 포스팅에서 언급한 더 간단한 Json 라이브러리인 JSONObject 사용법에 대해 알아보자.
우선 다운로드는 에셋스토어에서 Json Object 로 검색해 설치해도 되고
JSONObject wiki (http://wiki.unity3d.com/index.php/JSONObject#Download) 에서 다운로드 받을 수 있다.
다운 받아 압축풀고 Assets 폴더에 넣으면 설치는 끝.
문법
//1. Json string 을 JsonObject 로 변환 JSONObject obj = new JSONObject(response.Text);
//2.JsonObject 를 Dictionary 로 변환 Dictionary<string, string> dic = obj.ToDictionary();
// 3.빈 JsonObject 생성 JSONObject j = new JSONObject(JSONObject.Type.OBJECT);
//4.항목추가 j.AddField("field1", "sampletext");
//5.array 만들기 JSONObject arr = new JSONObject(JSONObject.Type.ARRAY); j.AddField("field2", arr); arr.Add(1); arr.Add(2); arr.Add(3);
//6.항목 삭제 j.RemoveField("field1");
//7.JsonObject 을 Json 문자열로 변환 string encodedString = j.Print();
끝.
더 간단하다.
=======================
=======================
=======================
출처: https://wergia.tistory.com/164
유니티에서 JSON 사용하기(Unity JSON Utility)
작성 기준 버전 :: 2018.3.1f1
JSON은 웹이나 네트워크에서 서버와 클라이언트 사이에서 데이터를 주고 받을 때 사용하는 개방형 표준 포멧으로, 텍스트를 사용하기 때문에 사람이 이해하기 쉽다는 장점이 있다.
이런 JSON 포멧을 유니티에서도 많이 사용하는 편이다. 네트워크 게임을 개발할 때 게임에 필요한 데이터를 주고 받거나, 게임 진행 상황을 저장하거나, 게임 설정을 저장하는 방식으로도 사용할 수 있다.
유니티에서 XML을 사용하는 것과 사용 범위가 거의 일치하는데, XML은 가독성이 매우 떨어지고 데이터를 넣거나 꺼내기 위해 파싱(Parsing)하는 과정이 까다로운데 반해서, JSON은 XML에 비해서 가독성이 좋고 직렬화(Serialize)와 비직렬화(Deserialize) 함수를 통해서 데이터에서 JSON 데이터로, JSON 데이터에서 데이터로 편하게 변환할 수 있다는 장점을 가지고 있다.
유니티에서 기본 제공하는 JsonUtility는 컴팩트한 최소한의 기능만을 제공하기 때문에 JSON 라이브러리의 모든 기능을 사용하고 싶다면 다른 JSON 라이브러리를 사용할 것을 권장한다.
JSON의 기본구조
기본적인 JSON 데이터의 구조는 다음과 같다.
{ "id":"wergia", "level":10, "exp":33.3, "hp":400, "items": [ "Sword", "Armor", "Hp Potion", "Hp Potion", "Hp Potion" ] } |
JSON의 데이터는 키(Key)와 값(Value) 쌍(Pair)로 이루어진 데이터를 저장하는데, items와 같이 배열로 된 데이터 역시 저장이 가능하고 객체 안에 객체를 넣는 것도 가능하며 위의 데이터 내용이 문자열로 이루어져 있기 때문에 사람이 알아보기가 매우 쉽다.
JSON 데이터에서 { } 는 객체를 의미하고, [ ] 는 순서가 있는 배열을 나타낸다. 그리고 JSON은 정수, 실수, 문자열, 불리언, null 타입의 데이터 타입을 지원한다.
JSON은 주석을 지원하지 않기 때문에, JSON 파일을 사람이 읽고 수정할 수 있도록 할 예정이라면, 키의 이름을 명확하게 정해서 이 값이 무엇을 의미하는 지 하는게 좋다.
JSON의 단점은 작은 문법 오류에도 매우 민감하다는 점이다. 중간에 중괄호나 대괄호, 콜론, 쉼표가 하나라도 빠지면 JSON 파일이 깨져버리고 파일을 읽어들일 수 없게 된다. 이런 문제 때문에 구글에서 JSON 검사기를 검색하면 JSON 데이터가 유효한지 검사해주는 웹페이지들이 많다. JSON 데이터를 작성하고 난 뒤에는 JSON 데이터 파일의 깨짐으로 인한 버그를 막기 위해서 이런 JSON 검사기로 검사하고 사용하는 것이 좋다.
유니티에서 JSON 사용하기
JSON에 대해서 간단하게 알아보았으니 이제 유니티에서 JSON을 사용하는 방법에 대해서 알아보자.
기본적인 JSON <-> Object 변환하기
우선 Json 예제를 작성할 JsonExample 클래스를 하나 생성한다.
using System.Collections; using System.Collections.Generic; using UnityEngine; public class JsonExample : MonoBehaviour { // Start is called before the first frame update void Start() { } // Update is called once per frame void Update() { } } |
유니티가 제공하는 JsonUtility는 UnityEngine 네임스페이스에 포함되어 있기 때문에, 다른 using 지시문을 추가할 필요가 없다.
그리고 JSON 데이터와 오브젝트 간에 시리얼라이즈, 디시리얼라이즈 테스트를 위해 다음과 같은 클래스를 정의한다.
[System.Serializable] public class JTestClass { public int i; public float f; public bool b; public Vector3 v; public string str; public int[] iArray; public List iList = new List(); public JTestClass() { } public JTestClass(bool isSet) { if (isSet) { i = 10; f = 99.9f; b = true; v = new Vector3(39.56f, 21.2f, 6.4f); str = "JSON Test String"; iArray = new int[] { 1, 1, 3, 5, 8, 13, 21, 34, 55 }; for (int idx = 0; idx < 5; idx++) { iList.Add(2 * idx); } } } public void Print() { Debug.Log("i = " + i); Debug.Log("f = " + f); Debug.Log("b = " + b); Debug.Log("v = " + v); Debug.Log("str = " + str); for (int idx = 0; idx < iArray.Length; idx++) { Debug.Log(string.Format("iArray[{0}] = {1}", idx, iArray[idx])); } for (int idx = 0; idx < iList.Count; idx++) { Debug.Log(string.Format("iList[{0}] = {1}", idx, iList[idx])); } } } |
여러 가지 타입과 배열, 리스트를 가지고 있는 클래스이기 때문에 오브젝트를 JSON 데이터로 변환하기에 좋은 클래스이다.
JSON 테스트용 클래스를 모두 작성했으면 JsonExample 클래스에 다음 함수 두 개를 구현한다.
string ObjectToJson(object obj) { return JsonUtility.ToJson(obj); } T JsonToOject(string jsonData) { return JsonUtility.FromJson(jsonData); } |
ObjectToJson() 함수는 JsonUtility 클래스의 ToJson() 함수를 이용해서 오브젝트를 문자열로 된 JSON 데이터로 변환하여 반환하는 처리를 하고 JsonToObject() 함수는 FromJson() 함수를 이용해서 문자열로 된 JSON 데이터를 받아서 원하는 타입의 객체로 반환하는 처리를 한다.
함수들을 모두 작성했다면 Start() 함수에 우선 ObjectToJson() 함수를 테스트하는 코드를 작성한다.
void Start() { JTestClass jtc = new JTestClass(true); string jsonData = ObjectToJson(jtc); Debug.Log(jsonData); } |
코드를 저장한 뒤 에디터로 돌아가서 JsonExample을 게임 오브젝트에 붙이고 플레이 버튼을 눌러보면 JTestClass 객체가 JSON 데이터로 변환되어 로그로 출력되는 것을 확인할 수 있다.
그 다음에는 Start() 함수 아래에 JsonToObject() 함수를 테스트하는 다음 코드를 작성한다.
var jtc2 = JsonToOject(jsonData); jtc2.Print(); |
그리고 코드를 저장하고 에디터로 가서 플레이 버튼을 눌러보면 문자열인 JSON 데이터가 JTestClass 객체로 변환되어 정상적으로 작동하는 것을 확인할 수 있다.
출처: https://wergia.tistory.com/164 [베르의 프로그래밍 노트]
=======================
=======================
=======================
*기타관련링크
- https://scvtwo.tistory.com/18
- https://smilejsu.tistory.com/1570
- https://chameleonstudio.tistory.com/56
- https://m.blog.naver.com/wolat/220865546178
- https://jeahnote.tistory.com/150
- https://code-examples.net/ko/q/2638c9a
- https://answers.unity.com/questions/1123326/jsonutility-array-not-supported.html
- https://forum.unity.com/threads/how-to-load-an-array-with-jsonutility.375735/
=======================
=======================
=======================
'게임엔진관련 > 유니티 엔진' 카테고리의 다른 글
[Unity] 유니티 최적화, 로딩, 관리, 리소스 관련 (2) | 2019.03.24 |
---|---|
[Unity] 유니티 리소스 읽기, 경로 관련 (0) | 2019.03.22 |
[Unity] 유니티 한글, 영어, 일본어, 중국어 등 아시아 Font 처리 관련 (1) | 2019.03.21 |
[Unity] 유니티 XML 데이터 읽기, 파싱, 파서 관련 (0) | 2019.03.21 |
[Unity] 유니티개발 csv 파일 읽기 관련 (0) | 2019.03.21 |
댓글 영역