JSON이란?
JSON은 Key-Value 쌍의 형태로 인간이 보기에 알맞은 형태로 데이터 오브젝트를 표현해주는 표준 포맷이다.
Value값에 사용할 수 있는 자료형으로는 수, 문자열, Bool, 배열, 객체, Null이 있다.
직렬화, 역직렬화란?
직렬화란 객체의 상태를 보관이나 전송 가능한 상태로 변환하는 것을 말한다. 직렬화된 상태의 객체를 다시 사용할 수 있는 객체로 변환하는 것을 역직렬화라 한다.
GoLang에서 JSON을 사용하는 방법
기본 사용 방법
JSON을 사용하기 위해서는 기본적으로 데이터를 담을 수 있는 객체가 필요하다.
테스트에 객체로 사용할 구조체는 간단한 구조의 jsonTestStructure를 사용한다.
type jsonTestStructure struct {
TestNum int
TestMessage string
}
여기서 확인할 수 있는 특이한 점은 구조체가 가지고 있는 필드의 첫 글자가 대문자 라는 점이다.
GoLang의 JSON패키지는 대문자로 시작하는 필드만 직렬화를 진행하기 때문에 jsonTestStructure의 필드의 첫 글자를 대문자로 변경한 것이다.
객체를 만들어 직렬화 시켜보자. json패키지의 Marshal함수를 사용한다. 어떠한 형태의 데이터든 입력값으로 사용할 수 있으며 자료형 byte[]가 그 결과값으로 나오게되는 함수이다.
그리고 그 결과를 데이터 관리에 사용되는 byte[]형식과 사람이 보기에 편한 string형태로 살펴보자.
코드
data := []jsonTestStructure{
{
TestNum: 1,
TestMessage: "Test1",
},
{
TestNum: 2,
TestMessage: "Test2",
},
{
TestNum: 3,
TestMessage: ,
},
}
b, _ := json.Marshal(data)
fmt.Println("byte : " + fmt.Sprint(b))
fmt.Println("string : " + string(b))
결과
(조금 더 편하게 확인할 수 있도록 결과를 웹에서 출력하도록 하겠다.)
보이는 것과 같이 직렬화가 잘 적용되는 것을 볼 수 있다.
json 태그
대문자로 시작하는 필드명만을 json패키지가 직렬화를 시켜준다 하였다. 하지만 그렇게 사용하고싶지 않다면?
방법이 있다.
코드
type jsonTestStructure struct {
TestNum int `json:"testNum"`
TestMessage string `json:"testMessage"`
}
구조체의 필드에 JSON에서 사용하고자 하는 필드 명을 json태그를 달고 입력해 주면 된다.
결과
나는 TestNum필드는 JSON형태로 보여주기 싫다.
또 TestNum3의 TestMessage의 빈 값 또한 보여주기 싫다!! 한다면..
코드
type jsonTestStructure struct {
TestNum int `json:"-"`
TestMessage string `json:"testMessage,omitempty"`
}
이렇게 json 태그를 달아주면 된다.
결과
unmarshal
JSON형태의 값을 GoLang의 객체로 다시 만들고자 한다면 어떻게 해야할까?
일딴 값이 들어갈 수 있는 객체가 필요하겠다. 그리고 JSON형태의 값을 json패키지의 Unmarshal 함수에 byte[] 자료형으로 입력하고 값을 입력할 객체의 주소값을 같이 입력해 준다.
코드
unmarshalVal := jsonTestStructure{}
json.Unmarshal([]byte(`{"TestNum":0,"TestMessage":"Test0"}`), &unmarshalVal)
fmt.Println(unmarshalVal.TestNum)
fmt.Println(unmarshalVal.TestMessage)
결과
'Study > Go' 카테고리의 다른 글
[Go] 고루틴(Goroutine) 알고쓰기(2) - Block 처리방식, Channel (0) | 2021.09.17 |
---|---|
[Go] 고루틴(Goroutine) 알고쓰기(1) - 동시성, 병렬성 프로그래밍 그리고 고루틴 (0) | 2021.09.01 |
[Go] 웹 서버(Web Server) 열기 (0) | 2021.07.27 |
[Go] Slice와 Array 알고 쓰기 (0) | 2021.07.21 |
[Go] GC(Garbage Collector) (0) | 2021.07.18 |