Unmarshal
JSON string 을 interface 로 변환합니다.
변환된 interface 는 go에서 참조하기가 수월합니다.
JSON to Struct
구조체를 선언하고 json 을 매핑하는 예시입니다.
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
| type Me struct { Name struct { First string Last string } Job string }
test := `{ "name": { "first": "LEE", "last": "JAE WOOK" }, "job": "developer" }`
data := Me{} err := json.Unmarshal([]byte(test), &data)
if err != nil { fmt.Println(err) }
fmt.Println(data) fmt.Println("full name: " + data.Name.First, data.Name.Last) fmt.Println("job: " + data.Job)
|
result
1 2 3
| {{LEE JAE WOOK} developer} full name: LEE JAE WOOK job: developer
|
JSON to Map
map 자료형에 매핑하는 예시입니다.
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
| test := `{ "name": { "first": "LEE", "last": "JAE WOOK" }, "job": "developer" }`
data := make(map[string]interface{}) err := json.Unmarshal([]byte(test), &data)
if err != nil { fmt.Println(err) }
fmt.Println(data)
name := data["name"].(map[string]interface{})
fmt.Println("full name: " + name["first"].(string) + name["last"].(string)) fmt.Println("job: " + data["job"].(string))
|
result
1 2 3
| map[job:developer name:map[first:LEE last:JAE WOOK]] full name: LEEJAE WOOK job: developer
|
주의
- Unmarshal 의 첫번째 파라미터 타입은
[]byte
이므로 string 을 전달하지 않고 []byte()
를 통해 변환하여 전달합니다.
- Map 으로 변환할 경우 하위 요소에 접근할때마다 캐스팅을 해주어야 합니다.
JSON to Nested Map
다차원 맵으로 파싱
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| test := `{ "name": { "first": "LEE", "last": "JAE WOOK" }, "job": { "major": "developer", "minor": "lol player" } }`
data := make(map[string]map[string]string) err := json.Unmarshal([]byte(test), &data)
if err != nil { fmt.Println(err) }
fmt.Println(data) fmt.Println("full name: " + data["name"]["first"] + data["name"]["last"]) fmt.Println("job: " + data["job"]["major"] + ", " + data["job"]["minor"])
|
result
1 2 3
| map[job:map[major:developer minor:lol player] name:map[first:LEE last:JAE WOOK]] full name: LEEJAE WOOK job: developer, lol player
|
Marshal
interface 를 JSON string 으로 변환합니다.
Map to JSON
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| type Me struct { Name struct { First string Last string } Job string }
me := Me{} me.Name.First = "LEE" me.Name.Last = "JAE WOOK" me.Job = "developer"
meJson, err := json.Marshal(me) if err != nil { fmt.Println(err) }
fmt.Println(string(meJson))
|
result
1
| {"Name":{"First":"LEE","Last":"JAE WOOK"},"Job":"developer"}
|
JSON 핸들링 라이브러리
gojsonq
https://godoc.org/github.com/thedevsaddam/gojsonq
1 2 3 4 5 6 7 8 9 10
| package main
import "github.com/thedevsaddam/gojsonq"
const json = `{"name":{"first":"Tom","last":"Hanks"},"age":61}`
func main() { name := gojsonq.New().FromString(json).Find("name.first") println(name.(string)) }
|