Json
- Json 유틸리티 또는 외부 라이브러리로 사용할 수 있다.
- FromJson(Json 문자열)
- ToJson(경로)
- Json 유틸리티 단점 ; Dictionary를 지원하지 않는다.
구조
- Key, Value 형식으로 데이터를 저장한다.
- Key는 ‘,’ 콤마로 구분한다.
- 모든 Key와 Value는 {} 중괄호 안에 정의된다.
{
"object" : {
"a"; "b",
"c": "d"
},
~~~
}
- 이 object도 하나의 Key Value 페어가 될 수 있다.
- object, array, bool, string, int 등이 있다.
[
{
"position": {
"X": 5.17811775,
"Y": 4.5870347,
"Z": -1.49516964
},
"rotation": {
"X": 0.333858728,
"Y": 0.418717951,
"Z": 0.0449003465
},
"scale": {
"X": 1.92924368,
"Y": 1.26624584,
"Z": 1.38748074
},
"color": {
"R": 0.757071,
"G": 0.979342759,
"B": 0.207612664,
"A": 1.0
}
}
]
작성방법
- 직접 타이핑
- 괄호 구분과 ‘,’ 로 구분한다.
- JsonUtility
- 객체 직렬화 형식으로 사용할 수 있다.
외부 라이브러리 사용법
com.unity.nuget.newtonsoft-json
- pakage Manager → 좌측 상단 + 버튼 클릭 → Install pakage by name 클릭 → 깃 이름 경로 입력 → 인스톨
- 이후 using Newtonsoft.Json; 스크립트에 추가
using Newtonsoft.Json;
외부 라이브러리 문제
- Vector3는 넣지 못한다.
- Vector3 obj;
- obj.position.normalized처럼 객체를 통해서 재귀적으로 나의 데이터형을 참조하는 방법을 못쓰기 때문이다.
- 따로 이게 가능하도록 코드를 작성한 다음에 그걸 가져와서 써야한다.
public class Vector3Converter : JsonConverter<Vector3>
{
public override Vector3 ReadJson(JsonReader reader, Type objectType, Vector3 existingValue, bool hasExistingValue, JsonSerializer serializer)
{
Vector3 v = Vector3.zero;
JObject jobj = JObject.Load(reader); //JObject 객체 생성
//""는 내가 작성하는 이름
v.x = (float)jobj["X"]; //Jobject 형식으로 넘어오기에 알맞은 데이터형으로 형변환 해줘야한다.
v.y = (float)jobj["Y"];
v.z = (float)jobj["Z"];
return v;
}
public override void WriteJson(JsonWriter writer, Vector3 value, JsonSerializer serializer)
{
writer.WriteStartObject(); //중괄효 열기
//키 이름을 지정하고, 벨류를 할당해야한다.
writer.WritePropertyName("X");
writer.WriteValue(value.x);
writer.WritePropertyName("Y");
writer.WriteValue(value.y);
writer.WritePropertyName("Z");
writer.WriteValue(value.z);
writer.WriteEndObject(); //중괄호 닫기
}
}
경로 설정
- Application.persistentDataPath : AppData의 프로젝트 폴더에 저장되는 경로를 반환한다.
var path = Path.Combine(Application.persistentDataPath, "test.json");
- 보통은 텍스트 파일을 통째로 읽고 쓰는 작업을 추가로 해준다.
- 경로를 지정할때는 기본 경로 말고 특정 경로를 사용해야한다. => Application.persistentDataPath
- 이유 : 어떤 플랫폼이든 정상적으로 동작할 수 있도록 하기 때문이다.