본문 바로가기

Go

(Go) - Marshal, Unmarshal 함수

반응형

🍳머리말

Marshal과 Unmarshal함수에 대해 설명한 글입니다.


📕Marshal

📔 정의

https://ko.wikipedia.org/wiki/%EB%A7%88%EC%83%AC%EB%A7%81_(%EC%BB%B4%ED%93%A8%ED%84%B0_%EA%B3%BC%ED%95%99) 

 

마샬링 (컴퓨터 과학) - 위키백과, 우리 모두의 백과사전

컴퓨터 과학에서 마셜링(marshalling, l을 하나만 사용하여 marshaling이라고도 표기)이란 한 객체의 메모리에서 표현방식을 저장 또는 전송에 적합한 다른 데이터 형식으로 변환하는 과정이다. 또한

ko.wikipedia.org

data를 다른 program이 인식할 수 있는 형태로 적합하게 변형하는 것입니다. 이를 수행하면 예를 들어, 서로 떨어진 객체끼리의 통신을 위해 string 또는 int 등 여러 자료형으로 표현된 data를 byte값으로 변형해 전송할 수 있게 됩니다.

📔 go에서 Marshal 함수

 

func Marshal(v interface{}) ([]byte, error)

go에서는 mashal함수의 인자로 정수형, 구조체 type이 들어가며, byte list 반환값을 가지게 됩니다. 

 

📘 예시

*struct의 key값을 대문자로 써야합니다. 그렇지 않다면 string으로 변환하는 과정에서 공백을 출력하게 됩니다.

package main

import (
	"encoding/json"
	"fmt"
)

type Info struct {
	Stmt string
	Num  int
}

func main() {
	var i = Info{"WHY", 1}
	bytes, _ := json.Marshal(i);
	bytes2, _ := json.Marshal(true);
	fmt.Println(bytes) //[123 34 83 116 109 116 34 58 34 87 72 89 34 44 34 78 117 109 34 58 49 125]
	fmt.Println(bytes2) //[116 114 117 101]
	fmt.Println(string(bytes)) //{"Stmt":"WHY","Num":1}
	fmt.Println(string(bytes2)) //"true"
}

 

struct type을 정의 시  tag를 이용하면 property를 바꿀 수 있습니다. Json 형태의 data를 변형해 출력가능함을 의미합니다. tag는 '(back slash)로 감싸 표현합니다. 다음은 json을 marshaling시 key값을 소문자로 변환토록 tag를 지정한 예시입니다.

 

📘 예시

package main

import (
	"encoding/json"
	"fmt"
)

type Info struct {
	Stmt string `json:"stmt"`
	Num  int `json:"age"`
}

func main() {
	var i = Info{"WHY", 1}
	bytes, _ := json.Marshal(i);
	fmt.Println(bytes) //[123 34 83 116 109 116 34 58 34 87 72 89 34 44 34 78 117 109 34 58 49 125]
	fmt.Println(string(bytes)) //{"stmt":"WHY","age":1}
}

 

다음처럼 특정 값을 출력하지 않도록 할 수 있습니다. 

📘 예시

package main

import (
	"encoding/json"
	"fmt"
)

type Info struct {
	Stmt string `json:"-"`
	Num  int `json:"age"`
}

func main() {
	var i = Info{"WHY", 1}
	bytes, _ := json.Marshal(i);
	fmt.Println(bytes) //[123 34 83 116 109 116 34 58 34 87 72 89 34 44 34 78 117 109 34 58 49 125]
	fmt.Println(string(bytes)) //{"age":1}
}

 

📔 go에서 MarshalIndent 함수

func MarshalIndent(v interface{}, prefix, indent string) ([]byte, error)

data 가독성을 위해 해당함수를 지원합니다. 

📘 예시

package main

import (
	"encoding/json"
	"fmt"
)

type Info struct {
	Stmt string `json:"-"`
	Num  int `json:"age"`
}

func main() {
	var i = Info{"WHY", 1}
	bytes, _ := json.MarshalIndent(i, "", "  ");
	fmt.Println(bytes) //[123 34 83 116 109 116 34 58 34 87 72 89 34 44 34 78 117 109 34 58 49 125]
	fmt.Println(string(bytes)) 
	/*
	{
  	"age": 1
	}
	*/
}

📕 Unmarshal

📔 정의

Marshal과 반대 개념입니다. byte list나 string을 논리적 자료구조로 decoding하는 것 입니다.

📔 go에서 Unmarshal

 

func Unmarshal(data []byte, v interface{}) error

 

첫 번째 인자로 byte list를 두 번째 인자로 받을 변수의 주소값을 넘겨줍니다.

 

📘 예시

package main

import (
	"encoding/json"
	"fmt"
)

func main() {
	var i bool
	json.Unmarshal([]byte("true"), &i)
	fmt.Println(i) //true
}

 

다음처럼 json문자열을 unmarshal할 수도 있습니다.

📘 예시

package main

import (
	"encoding/json"
	"fmt"
)

type Info struct {
	Stmt string 
	Num  int
}

func main() {
	var i = `{"Stmt" : "WHY", "Num" : 1}`
	var j Info
	json.Unmarshal([]byte(i), &j)
	fmt.Printf("%+v", j)
}

값이 구조체인 경우, %+v 변형은 구조체의 필드명까지 포함합니다.