Notice
Recent Posts
Recent Comments
Link
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
Archives
Today
Total
관리 메뉴

Code Habit

Golang ) Json 데이터 사용하기 본문

카테고리 없음

Golang ) Json 데이터 사용하기

코드베어 2020. 6. 17. 08:07

마샬링

논리적 구조를 로우 바이트로 변경하는 것을 마샬링 or 인코딩이라 한다. 즉 Go 자료형을 바이트 슬라이스로 변경하는 것이다.

 

언마샬링

반대로 로우 바이트를 논리적 자료 구조로 변경하는 것을 언마샬링 or 디코딩이라 한다.

 

encoding/json 패키지의 다음 함수들을 통해 go 자료형을 Json데이터로 변환하거나 반대로 Json데이터를 go 자료형으로 변환할 수 있다.

 

  • func Marshal(v interface{})([]byte, error): Go 언어 자료형 -> JSON 데이터 변환

  • func MarshalIndent(v interface{}, prefix, indent string)([]byte, error): Go 언어 자료형 -> JSON 데이터 변환 & 들여쓰기

  • func Unmarshal(data []byte, v interface{}) error : JSON 데이터 -> Go 언어 자료형 변환

 

사용 예제

// main.go
package main
 
import (
    "encoding/json"
    "fmt"
)
 
func main() {
    fmt.Println("json example")
 
    b, err := json.Marshal(true// bool 데이터를 json 데이터로 변환
    fmt.Println(b)                // [116 114 117 101]
    fmt.Println(string(b))        // true
}
 

bool형 데이터(true)를 json.Marshal 함수를 통해 json데이터로 변환하는데 반환되는 값은 []bye 형식이므로 보기 좋게 string형식으로 변환하여 출력해준다.

 

// main.go
package main
 
import (
    "encoding/json"
    "fmt"
)
 
type Person struct {
    Name string `json:"name"// 태그설정 : "name"
    Age  int    `json:"age"`  // 태그설정 : "age"
}
 
func main() {
    p := Person{"Jason"26}
    byteArray, err := json.Marshal(p)                // p 데이터 json데이터로 변환
    if err != nil {
        fmt.Println(err)
    }
 
    fmt.Println(p)                                    // {Jason 26}
    fmt.Println(string(byteArray))                    // {"name":"Jason","age":26}
 
 
    byteArray, err = json.MarshalIndent(p, """ "// 들여쓰기 적용하여 변환
    fmt.Println(string(byteArray))                  // {
}                                                   //    "name":"Jason",
                                                    //    "age":26
                                                    // }
 

구조체 Person을 선언해주고 각 멤버에 json 태그를 설정해준다. 이렇게 태그를 적용하면 json 데이터의 키를 소문자로 시작할 수 있다. ex) Name -> name. json.Marshal 함수로 변환하면 한줄로 출력되므로 보기 좋게 json.MarshalIndent 함수로 들여쓰기를 적용한다.

 

// main.go
package main
 
import (
    "encoding/json"
    "fmt"
)
 
type Person struct {
    Name string `json:"name"// 태그설정 : "name"
    Age  int    `json:"age"`  // 태그설정 : "age"
}
 
func main() {
    p := Person{"Jason"26}
    byteArray, err := json.Marshal(p)                // p 데이터 json데이터로 변환
    if err != nil {
        fmt.Println(err)
    }
 
    fmt.Println(p)                                    // {Jason 26}
    fmt.Println(string(byteArray))                    // {"name":"Jason","age":26}
 
 
    byteArray, err = json.MarshalIndent(p, """ "// 들여쓰기 적용하여 변환
    fmt.Println(string(byteArray))                  // {
                                                    //    "name":"Jason",
                                                    //    "age":26
                                                    // }
 
    var data map[string]interface{}             // JSON 문서의 데이터를 저장할 공간을 맵으로 선언
    json.Unmarshal([]byte(byteArray), &data)    // json데이터를 맵 데이터로 변환
   fmt.Println(data)                           // map[age;26 name:Jason]
    fmt.Println(data["name"])                   // Jason
    fmt.Println(data["age"])                    // 26
}

json 데이터로 변환 된 데이터를 다시 map 데이터로 변환하여 출력하였다. json 데이터의 필드명은 map데이터의 키(string)가 되는 것을 알 수 있다.