공부/Unity

Json, 외부 라이브러리 사용법

월러비 2025. 9. 9. 18:51

Json

  • Json 유틸리티 또는 외부 라이브러리로 사용할 수 있다.
  • FromJson(Json 문자열)
  • ToJson(경로)
  • Json 유틸리티 단점 ; Dictionary를 지원하지 않는다.

구조

  • Key, Value 형식으로 데이터를 저장한다.
  • Key는 ‘,’ 콤마로 구분한다.
  • 모든 Key와 Value는 {} 중괄호 안에 정의된다.
{
	"object" : {
	"a"; "b",
	"c": "d"
	},
	~~~
}
  • 이 object도 하나의 Key Value 페어가 될 수 있다.
    • 하나의 독립적인 Json으로 취급한다.
  • 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
    }
  }
]

작성방법

  1. 직접 타이핑
    1. 괄호 구분과 ‘,’ 로 구분한다.
  2. JsonUtility
    1. 객체 직렬화 형식으로 사용할 수 있다.

외부 라이브러리 사용법

com.unity.nuget.newtonsoft-json
  • pakage Manager → 좌측 상단 + 버튼 클릭 → Install pakage by name 클릭 → 깃 이름 경로 입력 → 인스톨
  • 이후 using Newtonsoft.Json; 스크립트에 추가
using Newtonsoft.Json;

외부 라이브러리 문제

  • Vector3는 넣지 못한다.
    • Vector3 obj;
    • obj.position.normalized처럼 객체를 통해서 재귀적으로 나의 데이터형을 참조하는 방법을 못쓰기 때문이다.
    • 따로 이게 가능하도록 코드를 작성한 다음에 그걸 가져와서 써야한다.
      • JsonConveter를 재정의할 수 있다.
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
    • 이유 : 어떤 플랫폼이든 정상적으로 동작할 수 있도록 하기 때문이다.