Go | JSON 데이터 사용법

Go | JSON 데이터 사용법

JSON(JavaScript Object Notation)은 데이터를 교환하는 포맷으로써, 웹 브라우저와 서버 사이에서 데이터를 교환하는 데에 많이 사용되고 있다. Go언어에서 JSON을 사용하기 위해서는 표준 패키지인 encoding/json을 사용하면 된다. 패키지에 관한 자세한 설명은 여기를 참조하면 된다.

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 자료형으로 변환

JSON 인코딩(마샬링)

Go 데이터를 JSON 포맷으로 변환(인코딩)하기 위해서는 encoding/json 피키지의 Marshal() 함수를 사용한다. Go는 주로 구조체나 Map 데이터를 JSON으로 인코딩하게 되는데, 데이터 값을 json.Marshal()의 파라미터로 전달하게 되면, JSON으로 인코딩 된 byte배열과 error객체를 반환하게 된다.

package main import ( "encoding/json" "fmt" ) func main() { data := make(map[string]interface{}) // key: 문자열, value: 모든 자료형을 저장하는 맵 생성 data["name"] = "Jin" data["age"] = 20 doc, _ := json.Marshal(data) // 맵을 JSON 문서로 변환 fmt.Println(string(doc)) } // {"age":20,"name":"Jin"}

JSON의 Key는 문자열이어야 한다. Go의 구조체는 자동으로 필드명을 문자열로 사용하게 되지만, Map인 경우엔 map[string]T 처럼 Key가 String인 Map만 지원한다. Value는 어떠한 값이든 상관없다.

MarshalIndent() 함수를 사용하여 쉽게 읽을 수 있도록 변환할 수 있다.

doc, _ := json.MarshalIndent(data, "", " ") // { // "age": 20, // "name": "Jin" // }

첫 번째 파라미터: JSON 문서로 만들 데이터

두 번째 파라미터: JSON 문서의 첫 칸에 표시할 문자열(Prefix). 주로 ""(빈 문자) 지정

세 번째 파라미터: 들여쓰기할 문자. 공백이나 탭 문자를 사용할 수 있음

JSON 디코딩(언마샬링)

JSON으로 인코딩 된 데이터를 다시 디코딩하기 위해서는 Unmarshal() 함수를 사용한다. 첫 번째 파라미터에는 JSON 데이터, 두 번째 파라미터에는 출력할 구조체 또는 Map을 포인터로 지정한다. 리턴 값을 에러 객체로, 에러가 없을 경우 두 번째 파라미터의 원래 데이터가 복원된다.

package main import ( "encoding/json" "fmt" ) func main() { doc := ` { "name": "Jin", "age": 20 } ` var data map[string]interface{} // JSON 데이터를 저장할 공간을 Map으로 선언 err := json.Unmarshal([]byte(doc), &data;) // doc을 byte 슬라이스로 변환하고, data의 포인터를 넣어줌 if err != nil { panic(err) } fmt.Println(data["name"], data["age"]) // Map의 Key를 이용하여 값을 가져옴 } // Jin 20

구조체를 활용한 JSON 표현

구조체로 타입을 정의할 때, 태그(`)를 이용하여 프로퍼티 명을 변경할 수 있다.

package main import ( "encoding/json" "fmt" ) type User struct { Name string `json:"name"` Age int `json:"age"` } func main() { var u = User{"Jin", 20} doc, _ := json.Marshal(u) fmt.Println(string(doc)) } // {"myName":"Jin","age":20}

필드명이 아닌 태그명으로 인코딩 된 것을 볼 수 있다.

Reference

from http://havving-do-it.tistory.com/237 by ccl(A) rewrite - 2021-10-09 21:01:36