0%

go json 다루기

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"
}`

// 깊이를 알수 없는 json 이므로 interface 에 담길수있도록 처리
data := make(map[string]interface{})
err := json.Unmarshal([]byte(test), &data)

if err != nil {
fmt.Println(err)
}

fmt.Println(data)
// fmt.Println(data["name"]["last"]) // 오류 발생. 이런식의 접근을 원하면 JSON to Nested Map 참조

// 하위 요소 index 에 접근하기 위해 캐스팅
name := data["name"].(map[string]interface{})

// interface 를 string 연산해야하므로 캐스팅
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

주의

  1. Unmarshal 의 첫번째 파라미터 타입은 []byte 이므로 string 을 전달하지 않고 []byte() 를 통해 변환하여 전달합니다.
  2. 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"
}
}`

// map 형식을 json 의 깊이와 동일하게 구성
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)) // Tom
}