Json (JavaScript Object Notation)
JavaScript 객체 문법으로 구조화된 데이터교환 형식
- 여러 언어에서 데이터 교환 형식으로 사용
- 단순 배열, 문자열도 표현 가능
JavaScript 객체문법
{
"name" : "Prev",
"name" : "Current", <-- name은 이것만 살아남음
"age" : 30,
"male" : True
}
// JSON ARRAY
[
{
"name" : "name01"
},
{
"name" : "name02"
}
]
참고: 단순 배열, 문자열 표시 가능
[a, b, c, d] --> 이것도 JSON
"This is JSON" --> 이것도 JSON
물론 이렇게 잘 안 쓰임
C#에서 JSON 읽고, 파싱하기
using (StreamReader file = File.OpenText(path))
{
using (JsonTextReader reader = new JsonTextReader(file))
{
JObject json = (JObject)JToken.ReadFrom(reader);
// Config
config.Ip = json["Ip"][0].ToString();
config.Port = (int)json["Port"];
config.LogPath = json["LogPath"].ToString();
config.LogKeepDate = (int)json["LogKeepDate"];
}
}
(출처: https://skfkdkdlaos.tistory.com/57 [이 세상엔 하고 싶은 것, 해야할 것이 많다:티스토리])
데이터 교환 형식
- 특정한 양식에 맞게 데이터를 교환
- 대표적인 교환 형식이 JSON
JSON은 독립적
- 언어는 버전 업 등 업데이트가 잦음
- 각 언어가 업데이트 했다고 해서 JSON 문법이 바뀌는 것이 아님
JSON 예제
{
"ost" : [
{
"name" : "마녀 배달부 키키",
"song" : "따스함에 둘러쌓인다면"
},
{
"name" : "하울의 움직이는 성",
"song" : "세계의 약속"
},
{
"name" : "하울의 움직이는 성",
"song" : 12334 --> JSON은 느슨한 타입이라 다른 형식도 가능하나 잘 안쓰임
}
]
}
느슨한 타입이므로 여러 타입을 작성할 수 있으나...
데이터 교환에 있어서 양식을 정했고 각 값에 타입을 정해준 스키마가 존재
-> 약속을 하고 주고 받으므로 타입을 지켜서 작성하는 것이 좋음
{
"name" : "큰돌",
"like" : [
{
"name" : "아령",
"weight" : 10,
"feature" : "육각형"
},
{
"name" : "바나나",
"color" : "green"
}
]
}
{
"name" : "큰돌",
"like" : [
"아령" : {
"weight" : 10,
"feature" : "육각형"
},
"바나나" : {
"color" : "green"
}
]
}
JSON 타입
undefined와 메서드를 포함하지 않음
- 수
- 문자열
- 참/거짓
- 배열
- 객체
- null
{
"a" : () => {
console.log(1)
},
"b" : undefined
}
// -> 에러
직렬화
외부의 시스템에서도 사용할 수 있도록 바이트(byte) 형태로 변환하는 기술
역직렬화
반대로 바이트(byte) 형식의 내용을 특정 데이터 형식으로 변환하는 기술
유니티에서 역직렬화 하는 예제
using System.IO;
using UnityEngine;
using Newtonsoft.Json;
public class JsonExample : Monobehaviour
{
public void LoadJsonToData01()
{
string path = Parh.Combine(Application.streamingAssetsPath, "a.json");
string json = File.ReadAllText(path);
MyData data = JsonUtility.FromJson<MyData>(json);
Debug.Log(data);
}
// 복잡한 Json인 경우 Newtonsoft.Json 사용
public void LoadJsonToData02()
{
string path = Parh.Combine(Application.streamingAssetsPath, "a.json");
string json = File.ReadAllText(path);
MyData data = JsonConvert.DeserializeObject<MyData>(json);
Debug.Log(data);
}
}
[System.Serializable]
public class MyData
{
public string name;
publid int age;
}
유니티에서 직렬화 하는 예제
using UnityEngine;
using Newtonsoft.Json
public class SerializeExample
{
public void Serialize()
{
PlayerData player = new PlayerData
{
name = "Knight",
level = 10,
hp = 75.5f
};
string json = JsonUtility.ToJson(player);
}
}
// 그 외 다양한 직렬화 / 역직렬화 코드
using System.Text;
using Newtonsoft.Json;
// 직렬화
string json = JsonUtility.ToJson(data);
byte[] bytes = Encoding.UTF8.GetBytes(json);
byte[] bytes = Encoding.UTF8.GetBytes(
JsonConvert.SerializeObject(data)
);
// 역직렬화
string jsonFromBytes = Encoding.UTF8.GetString(bytes);
PlayerData restored = JsonUtility.FromJson<PlayerData>(jsonFromBytes);
PlayerData restored = JsonConvert.DeserializeObject<PlayerData>(jsonFromBytes);
JSON 활용
프로그래밍 언어와 프레임워크 등에 독립적이므로 다른 시스템 간에 데이터를 교환하기에 좋음
- API 반환 형태, 시스템을 구성하는 설정 파일 등에 활용
- ex) 업비트의 API, package.json
'CS' 카테고리의 다른 글
| [CS 지식의 정석 - 필기 노트] XML (0) | 2025.12.15 |
|---|