본문 바로가기
Study/Go

[Go] Json 활용 방법

by _royJang 2021. 8. 12.

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)

결과