TIL - 14

Chu_uhC·2023년 11월 6일
0

TIL

목록 보기
14/16
post-thumbnail

📄 23.11.6✍ Json - 개념과 기본 예제

JSON (JavaScript Object Notation) : 키&밸류로 이루워진 데이터 형식, 텍스트 기반으로 되어있기 때문에 사용자가 읽기 편하고 최근에는 가장 많이 쓰이는 형식이다.

 요한 데이터를 메모리에 전부 올리거나 저장한 데이터를 메모리에 항상 들고 있을 수는 없다.
그래서 우리는 메모리가 아닌 HDD,SDD같은 보조 기억 장치에 데이터를 저장하고 필요할 때 역직렬화를 하여서 사용할 수 있다.
이렇게 외부에 저장하는 방법을 직렬화(Serialization)라고 하는데 그 때 사용하는 데이터 타입 중 하나인 Json을 만들고 실제로 적용까지 시켜보기로 하자.

🔨 Json.net으로 만들어보기

using System.IO; // 파일의 입출력을 담당한다.
using Newtonsoft.Json; // 대중적으로 많이 쓰이는 Json 직렬화 라이브러리

static void Main(string[] args)
{
	// 직렬화를 해줄 데이터!
    List<Fruit> fruits = new List<Fruit>
    {
        new Fruit(FruitType.Apple, "사과", 20, 5, true),
        new Fruit(FruitType.Banana, "바나나", 10, 2, true),
        new Fruit(FruitType.Orange, "오렌지", 15, 0, false)
    };
    
    // 직렬화를 하기 위해서는 세 가지를 해야한다.
    // 1. 데이터를 json 형식으로 변환하기
    // json은 텍스트 기반이기에 string으로 관리할 수 있다.
    string json = JsonConvert.SerializeObject(fruits);
    
    // 2. 위치와 파일명 지정해주기
    // Path.Combine을 사용하는 이유는 주소 형식이 다를 수 있는 데 이걸 맞춰준다.
    string path = Path.Combine($"C:/Fruit.Json");
	
    // 3. string을 path로 출력한다.
    File.WriteAllText(path, json); // System.IO
}

public enum FruitType { Apple, Banana, Orange }
public struct Fruit
{
	// public으로 하지 않으면 접근할 수 없다!
    public FruitType fuiltType;
    public string name;
    public int price;
    public int count;
    public bool isSell;
	...
}

📬 결과물

[{"fruitType":0,"name":"사과","price":20,"count":5,"isSell":true},{"fruitType":1,"name":"바나나","price":10,"count":2,"isSell":true},{"fruitType":2,"name":"오렌지","price":15,"count":0,"isSell":false}]

📌 위의 코드대로 하면 이름 그대로 '직렬화'해서 출력해 주는데 당연하게도 이 부분을
     '예쁘게' 하는 방법이 존재한다.
     JsonConvert.SerializeObject(fruitsm,Formatting.Indented)로 변경해준다면
     맨 위 사진처럼 들여쓰기해서 출력해준다.

📌 기본적으로 public인 필드 값만 직렬화해준다.

번에 Json을 직렬화한 방법은 Newtonsoft.Json (Json.net)을 이용하여 해보았다.
다른 방법들로는 유니티에서 지원해주는 JsonUtility, .NET의 라이브러리인 System.Text.Json이 대표적으로 존재하고 데이터 타입도 다양한 종류들이 있다.
이런 방법들은 각자 장단점이 존재하는데 그 것들은 다음 시간에 알아보도록하자

🎉 한 장 요약



📄 23.11.7✍ Json - 다양한 방법들

✨ 앞서 우리는 가장 많이 사용되는 Json.Net을 사용하여서 직렬화하는 방법을 사용해보았다. 좀 더 나아가 다른 방법으로 직렬화를 하고 역직렬화까지 하는 방법을 알아보자.

이름요약
Json.NetJson의 큰형님, 오랫동안 사랑받아온 만큼 일단 믿고 사용하면 된다.
JsonUtility유니티의 박힌 돌, 간단한 데이터 입출력은 상당히 빠르다.
System.Text.Json젊은 순수 혈통, 언젠가는 Json.Net은 도태되고 주류가 될 수도 있다.

🔨 유니티의 직렬화 기능 - JsonUtility

List<Fruit> fruits = new List<Fruit> {...}; // 데이터 배열
string json = JsonUtility.ToJson(fruits, true); // Json으로 변환, true : 들여쓰기
string path = Path.Combine($"C:/Fruit.Json");
File.WriteAllText(path, json);
---------------------------------------
output : {}

 쉽게도 JsonUtility는 배열에 대한 지원이 부족하기에 딸깍으로는 불가능하지만..
한 번 더 클래스로 감싸준다면 가능하다.

Basket basket = new Basket();
basket.fruits = fruits;
string json = JsonUtility.ToJson(basket,true);
string path = Path.Combine($"C:/Fruit.Json");
File.WriteAllText(path, json);

[Serializable] // UnityUtility의 경우 달아줘야한다.
public class Basket { public List<Fruit> fruits; }
[Serializable]
public struct Fruit { ... }

 점이 너무나도 크기에 도태되어야 할 것 같지만 무려 공식 지원인 기능이기에 Unity의 데이터 유형(ex. Vector3)도 Json으로 관리가 가능하고 유니티 한정 퍼포먼스도 가장 뛰어난 직렬화 도구이다.

그렇기에 간단한 환경 설정 데이터 같이 적고 단순한 데이터는 JsonUtility로 사용해볼 수도 있다.

🔨 .Net의 직렬화 기능 - System.Text.Json

...
// 옵션을 따로 클래스로 만들어줘서 넣어줘야한다.
var option = new JsonSerializerOptions
{
    WriteIndented = true // 들여쓰기
};

string json = JsonSerializer.Serialize(fruits,option);
string path = Path.Combine($"C:/Fruit.Json");
File.WriteAllText(path, json);

// ※ 필드가 아닌 프로퍼티를 직렬화한다! ※ 
public class Fruit
{
	public FruitType FruitType { get; set; }
	public string Name { get; set; }
	public int Price { get; set; }
	public int Count { get; set; }
	public bool IsSell { get; set; }
    ...
}

📌 JsonSerializerOptions를 사용해서 직렬화 방식의 설정을 변경할 수 있다.

 엇보다 System.Text.Json의 가장 큰 장점은 표준 라이브러리하는 것, 이 라이브러리를 지원해주는 기업이 마이크로 소프트이다!
이 기능이 나오기 전에는 Json.net이 대부분이었지만 이제는 대부분 넘어가고 있다.
메모리와 성능적인 부분 또한 상대적으로 우수하나 예전 프로젝트에서는 호환이 안된다는 문제가 있다!

🎉 한 장 요약



📄 23.11.8✍ Json - 파싱과 역직렬화

파싱(Parsing) : 구문 분석, 데이터를 분석하고 구조를 해석하여 컴퓨터가 이해할 수있는 형태로 변환하는 과정
역직렬화(Deserialize) : 직렬화된 데이터 구조를 기존의 구조로 변환하는 과정

프로그램의 정보를 저장하고 다시 불러오는 과정은 역직렬화, 외부에서 데이터를 작성하고 들고오는 과정은 파싱에 해당된다. 하지만 보통 혼용되어서 사용하고 파싱으로 퉁쳐서 말하기도 한다.

 기서 우리는 지금까지 배워왔던 3가지의 라이브러리를 통하여 역직렬화를 해볼 것이다.

🔨 위촉오.Json 역직렬화 방법


#1 System.Text.Json
// 1. 기존의 데이터 타입 선언
List<Fruit> fruits = new List<Fruit>();

// 2. 불러올 파일의 주소와 이름
string path = Path.Combine($"C:/Fruit.Json");

// 3. Json 파일을 먼저 읽음
string json = File.ReadAllText(path);

// 4. 타입 인자값으로 기존 데이터 타입을 넣어주고, 인자값으론 읽어온 Json을 넣어준다,
fruits = JsonSerializer.Deserialize<List<Fruit>>(json);

#2 Json.NET
List<Fruit> fruits = new List<Fruit>();.
string path = Path.Combine($"C:/Fruit.Json");
string json = File.ReadAllText(path);
fruits = JsonConvert.DeserializeObject<List<Fruit>>(json);

#3 JsonUtility
List<Fruit> fruits = new List<Fruit>();
string path = Path.Combine($"C:/Fruit.Json");
string json = File.ReadAllText(path);
fruits = JsonUtility.FromJson<List<Fruit>>(json);

📌 조립은 분해의 역순이다라는 말은 여기서도 적용이 된다.

📌 세가지의 다른 점은 역직렬화하는 함수와 클래스만 다르다는 것!
     인자들을 넣는 것조차 똑같다!

 게 무엇이라고 이때까지 무서워했던가..
우리가 편집 프로그램을 키고 불러오고 저장하고 딸깍, 딸깍으로만 했는데 딸깍 하나당 코드 한줄이라고 생각하면 되었다... 무언가 복잡하고 어려운 과정은 없었다 😂

하지만 저장과 불러오기는 쉽지만 어떤 데이트를 저장하고, 어떻게 불러올지가 가장 문제였던 것이었다..

🎉 한 장 요약



📄 23.11.9✍ Json - Excel로 관리

✨ 개발자가 아무리 텍스트와 괄호들과 친하다고하지만 데이터를 시각화하여 관리할 수 있다면 뒤도 돌아보지않고 후자를 선택할 것이다.

 엇보다 중요한 건 Excel <-> Json <-> Program을 할 수 있다.
우리 프로그램에서 직렬화한 데이터를 Excel로 들고갈 수 있고, 반대로 Excel에서 만든 데이터를 들고 올 수도 있다. 물론 앞으로 설명할 구조 부분이 정확해야지 쉽게 역직렬화까지도 할 수 있다.

🔨 엑셀과 Json의 구조

[ // 객체 배열
  { // Json에서 중괄호{}는 객체를 나타낸다.
    "FruitType": 0, // 키 : "FruitType", 밸류 = 0
    "Name": "사과",
	...
  },
  {
    "FruitType": 1,
    "Name": "바나나",
	...
  }
]
배열 차원최대 배열의 차원딕셔 너리
Excel2일반적인 방법으로는 불가능
Json128가능 가능 완전 가능(키, 밸류, 배열 모두 가지고 있다)

📌 Excel에서 배열을 나타내는 부분은 키 다음번째 줄(두 번째 줄)부터 아래 방향이다.

 렇게 만들어진 Excel은 다양한 방법으로 Json으로 변환되고 Json은 다시 프로그램으로 돌아가서 사용할 수 있게 된다.

🔨 예시.구글 스프레드 시트

1. 엑셀을 .csv 파일로 보낸다.
2. .csv을 복사한다.
3. 컨버터나 챗GPT에게 맡긴다 끝.


📌 챗GPT는 생각보다 정확하지 않아서 주의할 필요가 있다.

📌 만들어진 Json은 반드시 유효성 검사를 해보는 것이 좋다.

 지고 있는 엑셀 프로그램의 기능을 살펴보면 Json으로의 변환을 지원하고 있는 경우도 있으니 그걸 활용하면 된다.

아무튼 이제 마지막으로 지금까지 배운 것을 활용하여 엑셀 파일을 작성하고 활용해보는 과정만 남았다.

🎉 한 장 요약



📄 23.11.10✍ Json - 응용

1.Json을 SO로 변경하고 Datamanager에서 딕셔너리에 집어넣고 사용하기
1-1 게임 시작없이 함수 실행법 contextmenu? 넣기

📌 SO에서 딕셔너리를 만들어 관리하면 게임 종료시 데이터가 날아감 그래서 할 때 마다 입력해줘야함 이거 쓸모 있음?

      

profile
ChuNyan

0개의 댓글