[Go lang] JSON Marshal & Unmarshal (마샬, 언마샬)
Marshal & Unmarshal / json / 월드스테이트 DB
마샬(marsha)
데이터(객체)를 JSON 화 시키면 일렬로 바뀌는데
👉 이것을 ‘바이트 코드’ (byte code) 라고도 한다
Go 언어에서는 이것을
👉 마샬(marsha) = 직렬화 이라고 한다
언마샬(Unmarshal)
JSON 을 다시 데이터(객체)로 변환시키면
👉 이것을 언마샬(unmarshal) = 역직렬화 이라고 한다
ChainCode Marshal & Unmarshal
-
기본 형태
구조체(데이터) 👉 json 형식으로 변환 👉 json 에서 필요한 값을 구조체(데이터)로 변환해서 사용 -
web2.0 에서의 사용형태
모바일앱 데이터 👉 데이터베이스(json) 👉 웹브라우저에서 읽음 -
web3.0 에서의 사용형태
스마트컨트랙트 데이터 👉 월드스테이트 DB (json) 👉- 데이터베이스 자체에서도 열어볼 수 있고
- 익스플로어 모니터링에서도 열어볼 수 있고
- 스마트컨트랙트에서 다시 꺼내 볼 수도 있다
스마트컨트랙트는 Go 언어로 작성되어있지만
Unmarshal 되어 쓰이는 곳에서는 자바스크립트 일수도있고 파이썬일수도 있다
👉 그래서 블록에 저장될때 (원장에 저장될때) json 형식으로 저장한다
Marshal & Unmarshal 예제
package main
import (
"encoding/json" // marshal 을 사용하기위해 import
"fmt"
"log"
)
// 데이터를 json화 시키면 일렬로 바뀌는데 이것을 바이트 코드라고 한다
// 👉 직렬화 = 마샬(marshal) 이라고 한다
// json을 데이터(객체)로 변환시키면 이것을 👉 역직렬화 = 언마샬(unmarshal) 이라고 한다
type Task struct {
Title string
Status int
}
func main() {
ExampleTask_marshalJSON()
ExampleTask_unmarshalJSON()
}
func ExampleTask_marshalJSON() {
t := Task{
"Laundry",
1,
} // 👉 marsha 시킨다 (한줄로 만들어줌)
b, err := json.Marshal(t) // t 변수를 Marshal함수에 넣고 돌린다
// 에러가 날 경우도 변수로
if err != nil { // 에러 발생시
log.Println(err)
return
}
fmt.Println(string(b))
// 출력값 👉 {"Title": "Laundry", "Status": 1}
}
func ExampleTask_unmarshalJSON() {
b := []byte(`{"Title":"Buy Milk","Status":2}`)
t := Task{} // b 를 unmarsha시켜서 t 에 넣어주기 위한 공간
err := json.Unmarshal(b, &t) // 👉 unmarsha 시킨다 (json을 풀어준다(해체))
// b 를 unmarsha 시켜서 t 주소로 넣어준다
if err != nil {
log.Println(err)
return
}
fmt.Println(t.Title) // 👉 Buy Milk
fmt.Println(t.Status) // 👉 2
}
// 구조체(데이터) 👉 json 👉 json에서 필요한 값을 구조체(데이터)화 로 다시 변환
// 모바일앱 데이터 👉 데이터베이스(json) 👉 웹브라우저에서 읽음
// 스마트컨트랙트 데이터 👉 월드스테이트 데이터베이스 👉 데이터베이스자체 / 익스플로어 모니터링 / 스마트컨트랙트