Text 기반의 데이터교환 및 전송을 위한 가장 최적화된 표준 포맷으로 JSON을 뽑을 수 있는데요. Go에서는 map이나 struct 타입 객체에 대해 JSON 문자열로 인코딩할 수 있습니다. 여기서 map의 경우에는 그 key의 타입이 string이 아닌 경우 해당 타입을 string으로 변환이 가능할 경우에만 JSON 인코딩이 가능합니다. 다음 코드는 사용자 정의 struct에 대한 map 객체를 인코딩하는 예제입니다.
package main import ( "encoding/json" "fmt" ) type Detail struct { Age int Active bool } func main() { mem := map[string]Detail{ "Alex": {10, true}, "Dip2K": {20, true}, "Jackass": {15, false}, } jsonBytes, err := json.Marshal(mem) if err != nil { panic(err) } jsonString := string(jsonBytes) fmt.Println(jsonString) }
위의 코드를 실행하면 다음과 같은 결과를 볼 수 있습니다.
{"Alex":{"Age":10,"Active":true},"Dip2K":{"Age":20,"Active":true},"Jackass":{"Age":15,"Active":false}}
이제 다시 위에서 얻는 JSON 문자열을 객체로 인코딩해 보도록 하겠습니다. JSON 문자열을 다시 인코딩하기 위해서는 json.Unmarshal 함수를 사용합니다. 예제는 아래와 같습니다.
package main import ( "encoding/json" "fmt" ) type Detail struct { Age int Active bool } func main() { jsonString := ` { "Alex":{"Age":10,"Active":true}, "Dip2K":{"Age":20,"Active":true}, "Jackass":{"Age":15,"Active":false} }` mem := make(map[string]Detail) err := json.Unmarshal([]byte(jsonString), &mem) if err != nil { panic(err) } fmt.Println(mem) fmt.Println("Dip2K's Active:", mem["Dip2K"].Active) }
위의 코드에서 14번에 긴 문자열을 jsonString 변수에 담고 있는데요. 긴 문자열을 Go언어에서 입력하기 위한 방식으로 14~19번 코드를 주의해 보시기 바랍니다. 실행 결과는 다음과 같습니다.
map[Dip2K:{20 true} Jackass:{15 false} Alex:{10 true}] Dip2K's Active: true