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
