본문 바로가기

CS

[CS 지식의 정석 - 필기 노트] JSON과 직렬화 / 역직렬화

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